C#: rozdiel medzi ref a out – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C#: rozdiel medzi ref a out – .NET – Fórum – Programujte.comC#: rozdiel medzi ref a out – .NET – Fórum – Programujte.com

 

newo0
Newbie
7. 1. 2009   #1
-
0
-

caute, mohli by ste mi pomoct vysvetlit aky je rozdiel medzi ref a out v C#? ucim sa teraz ten jazyk z knihy a na tomto mieste som sa zastavil, lebo sa mi to tam zda nedostatocne alebo moc odborne vysvetlene. pozeral som to uz aj v inej knihe a aj na nete som nieco nasiel, ale stale neviem presne aky je tam rozdiel. Viem, ze sluzia na predavanie argumentu odkazom, ale neviem kedy a za akych podmienok sa ktory dava. takze ak by ste mi s tym niekto pomohol plus nejaky jednoduchy priklad bol by som rad.

dakujem

Nahlásit jako SPAM
IP: 87.244.199.–
7. 1. 2009   #2
-
0
-

Zdravím,
vezmu to zjednodušeně. Modifikátory ref (parametr předávaný odkazem) a out (výstupní parametr) se liší pouze v jedné věci.

Výstupní parametry se nemusí inicializovat předtím, než jsou předány metodě -> musí se přířadit dřív než metoda skončí. U parametrů předávaných odkazem je to přesně obráceně (musí se inicializovat před předáním metodě a pak už ne).

Z toho je jasné, kdy co použít.

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Japo0
Návštěvník
7. 1. 2009   #3
-
0
-

Při použití parametr ref musí být proměnná iniciálizována, při použití out nemusí, ale může. Příklad:

...

int a, b = 0, c;
MetodaRef(ref b);
MetodaOut(out a);
MetodaOut(out b);
MetodaRef(ref c); //chyba, selze, promenna c nema zadnou hodnotu
...

void MetodaRef(ref int a) {
//promenne a nemusim prirazovat hodnotu
}

void MetodaOut(out int a) {
a = 42;//promenne a musim prirazovat hodnotu
}

Nahlásit jako SPAM
IP: 90.176.243.–
sunamo0
Newbie
8. 1. 2009   #4
-
0
-

S tím ref je to trochu nepřesné, odkaz se předává referencí, což znamená, že změny členu v volané M se projeví i v volající..djanosik má v zásadě zjednodušeně pravdu, ale dokonalost je v detailu..

MetodaRef(ref c); //chyba, selze, promenna c nema zadnou hodnotu
Možná Chyba! Při kompilaci se nic nestane, chyba nastane až tehdy, když se na tomto prvku budou provádět nějaké M, získání hodnty nebo provádějí jeho metod. U všech platí, že je možno se samoz. na takovou situaci připravit.

Nahlásit jako SPAM
IP: 90.177.86.–
[url]http://sunamo.aspone.cz[/url]
Rostislav Hulík
~ Anonymní uživatel
1 příspěvek
3. 7. 2015   #5
-
0
-

#1 newo
Ahoj,

Hele je to jednoduche, metodu OUT použiješ když budeš chtít získat výslednou hodnotu z použité metody (metoda může třeba sčítat dvě čísla a ty pomocí OUT proměnné  získáš ten výsledek a uloží se ti do proměnné mimo metodu) a u ref je to přesně obráceně kdy proměnnou mimo metodu ovlivňuješ (referuješ, odkazuješ) na proměnnou v metodě (opět mimo metodu sečteš dvě čísla a výsledek uložíš do REF proměnné a metoda bude pracovat pouze s tím výsledkem)

Nahlásit jako SPAM
IP: 89.176.61.–
Matěj Andrle+1
Grafoman
4. 7. 2015   #6
-
0
-

#1 newo
Existují referenční a datové typy. U referenčních se někde alokuje místo a v proměnných se pak udržuje pouze adresa tohoto místa. Proto u referenčních datových typů dojde vždy ke změně na místě, na které proměnná ukazuje. I když si referenční proměnnou 200 krát přesměrujeme přes nejrůznější jiné proměnné - vždy se předá jen adresa, vždy se bude měnit jediné místo. Proto je ref a out zcela zbytečné. Postačí datové typy nastrkat do nějakého referenčního objektu. Datovým typem jest pouze cokoliv datového - integer (číslo), string (řetězec), boolean (příznak), ... Třídy, struktury, interface, ... - respektive jejich instance - jsou pak referenčními hodnotami. Slovíčko new totiž odjaktěživa dělá to, že alokuje místo v haldě a vrátí referenci - odkaz na místo, které zvolilo. Proto namísto ref/out porušujících OOP atd. je lepší vytvořit struct, kdy po předání reference na alokované místo může na toto místo kdokoliv jakkoliv přistupovat. Tedy jakkoliv zcela ne - dle modifikátorů atp.

(Tedy ref a out pracují s referencemi (ukazateli - pointery - adresami) datových typů. Ref předává referenci datové proměnné a out na referencí ukazované místo zapíše.)

Nahlásit jako SPAM
IP: 78.136.188.–
Ovrscout
~ Anonymní uživatel
112 příspěvků
7. 7. 2015   #7
-
0
-

Zajímavé oživení vlákna z roku 2009 :)

Jinak pokud bych to mněl říci selsky jednoduše tak je to dle mne takhle:

out se použije pokud předáváme data z metody ven (tj na vstupu funkce je daný parametr neinicializován)
ref se použije pokud předáváme data dovnitř i ven   (tj hodnota se předává jak do funkce tak ven)

Jinak samozřejmně implementační detaily (jako co kdy se inicializuje, kopíruje nebo že se odkazuje adresou) jsou velmi důležité. Ale pro pochopení základní myšlenky( k čemu to vlastně je dobré) u začínajícího programátora jsou občas trošku složité(pokud se má brát ohled na všechny detaily) a je třeba se k nim propracovat postupně.

Nahlásit jako SPAM
IP: 193.165.79.–
Matěj Andrle+1
Grafoman
7. 7. 2015   #8
-
0
-

#7 Ovrscout
Jak již jsem napsal - ref a out by se nemělo nikdy nikde používat. Vymysleli to sadisté a odpůrci zdravého rozumu...

Nahlásit jako SPAM
IP: 90.182.189.–
8. 7. 2015   #9
-
0
-

#8 Matěj Andrle

Říkal jsi, že pracují s pointery, ty se třeba v C používají, tak proč to porušuje OOP a nemělo by se to používat?  Docela mě to zajímá, protože.. neřikáš tím náhodou, že pointery by se taky neměly používat? Jestli ne, tak to nějak vysvětli, proč se to nemá používat, docela mě to zajímá.. Jestli se nemají používat pointery, tak mi taky řekni proč, díky

Nahlásit jako SPAM
IP: 93.99.225.–
Matěj Andrle+1
Grafoman
8. 7. 2015   #10
-
+1
-
Zajímavé

#9 Rutherther
Tak znovu - referenční typ = reference (vyšší pointer - neukazuje na reálnou adresu, anebrž na adresu virtuální). Datový typ - alokuje se na adrese reference = v referenčním objektu. Když někdo přijde a řekne: Na této referenci alokuj datový typ a to bez řádného referenčního objektu, pak nevytváří OOP modul, anebrž zcela narušuje princip a smysl OOP. V OOP má být vše v referenčních objektech, aby se to vždy dalo dědit, přetěžovat atd. Vše má být maximálně obecné atd. Proto je zhovadilost pracovat s datovým typem jakožto s referenčním. Vždyť neexistuje situace, ze které vás nedostane struktura, interface, ... Vždy stačí datový typ schovat v referenčním a není třeba ukazovat si přímo na data... (Což je další věc - bezpečnost - data v OOP jsou pěkně schována - modifikátory, zapouzdřením, ...) Jakmile data čumí jako chleba z tašky, tak je něco špatně... Chci přenášet hodnotu mezi objekty? Tak ji zapouzdřím do třídy/struktury/...

Nahlásit jako SPAM
IP: 90.182.189.–
8. 7. 2015   #11
-
0
-

#10 Matěj Andrle

Díky za vysvětlení.

Nahlásit jako SPAM
IP: 93.99.225.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý