Różnica pomiędzy Ref i Out w C#

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.

refOut_1

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.