Jakie są różnice pomiędzy słowami kluczowymi „ref” i „out” w C#?
Najważniejszą i jedyna różnicą jest to, że w przypadku słowa kluczowego „out” argument musi być zainicjowany w ciele metody.
Ale od początku. Najpierw przygotowujemy dwie metody. Jedną ze słowem kluczowym „ref” i drugą ze słowem kluczowym „out”.
private void ZrobCosZArgumentemRef(ref string argRef) { argRef += "REF"; } private void ZrobCosZArgumentemOut(out string argOut) { argOut += "OUT"; }
I już w tym miejscu widzimy różnice, o której pisałem wyżej. Różnicę widać w błędach kompilatora w linijkach 6 i 8, który informuje dokładnie w czym sprawa.
The out parameter 'argOut' must be assigned to before control leaves the current method
Ten błąd dotyczy metody ZrobCosZArgumentemOut, linijka 6. Mówi o tym, że argument argOut musi zostać zainicjowany zanim metoda się wykona.
Use of unassigned out parameter 'argOut'
Ten błąd dotyczy już samego argumentu, linijka 8. I dokładnie wskazuje, że argOut nie jest zainicjalizowany.
Więc aby używać słowa kluczowego „out” argument musi być zainicjowany w ciele metody, linijka 3.
private void ZrobCosZArgumentemOut(out string argOut) { argOut = string.Empty; argOut += "OUT"; }
Teraz metoda kompiluje się prawidłowo.
Aby jeszcze dokładniej zrozumieć tą różnicę poniżej przykład metody wykorzystującej metody ZrobCosZArgumentemOut i ZrobCosZArgumentemRef.
public void RefOut() { var testRef = "REF"; ZrobCosZArgumentemRef(ref testRef); string testOut; ZrobCosZArgumentemOut(out testOut); }
W linijce 5 wywołujemy metodę i przekazujemy referencje do zmiennej testRef. Zmienna testRef jest już zainicjalizowana. Słowo kluczowe „ref” wymaga aby argument przekazywany w ten sposób był już zainicjalizowany.
W linijce 9 wywołujemy metodę i przekazujemy referencje do zmiennej testOut. Zmienna testOut nie jest zainicjalizowana i nie musi być. Dla słowa kluczowego „out” zmienna nie musi mieć wartości.
Dla przypomnienia. Słowa kluczowe „ref” i „out” przekazują argumenty przez adres. Więc praca z nimi w metodzie zawsze będzie modyfikowała to samo miejsce w pamięci.
Ciekawostka. Słowa kluczowe „ref” i „out” nie wpływają na rozróżnienie metod podczas przeciążania. Czyli nie da się przeciążyć metod, które różnią się tylko typem zastosowanego słowa kluczowego.