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
Fórum › .NET
C#: rozdiel medzi ref a out
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.
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
}
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.
#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)
#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.)
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ě.
#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
#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/...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Rozdiel medzi volaním metod z tried — založil Pilot205
Rozdiel medzi WebClient a WebBrowser — založil dartanan
Aky je medzi tymto rozdiel: — založil SVKSuli
Rozdiel medzi programátorom a Systémovým vývojárom — založil w3q
Rozdiel medzi windows form app vs WPF — založil Anonymní uživatel
Moderátoři diskuze