Jason. Cała informatyka w jednym miejscu!

Poruszę w tym miejscu bardzo ważne zagadnienie języka C#. Język ten otwiera drogę do czegoś, czego język Java nie oferuje. Chodzi o przekazywanie zmiennych typu prostego do funkcji przez referencję za pomocą pary słów kluczowych. "ref" i "out" w języku C# pozwalają na przekazywanie przez referencję. Zarówno sam termin, jak i wyżej wymieniona słówka, są wyjaśniane w środku artykułu, do czytania którego gorąco zachęcam ;)!

"REF" I "OUT" W JĘZYKU C# ODNOSZĄ SIĘ DO TEGO SAMEGO

Ucząc się języka C#, powinno się znać te dwa słowa kluczowe: "ref" i "out". One otwierają drogę do tak zwanego "przekazywania przez referencję". I tu dotykamy terminu (jak i sedna sprawy), który trzeba wytłumaczyć ze szczególną starannością, więc najpierw zajmiemy się nim.

PRZEKAZYWANIE PRZEZ REFERENCJĘ

Są sytuacje, w których możecie potrzebować takich funkcji, które wykorzystują parametr typu prostego, a wszelkie wykonane operacje na wprowadzonej wartości obowiązują również PO zakończeniu instrukcji. Tradycyjnie, język C# działa odwrotnie w stosunku do prostych typów danych traktując parametry aktualne jak kopię. Może być jednak potrzebne wymuszenie działania, w taki sposób żeby utrwalić modyfikację zmiennej typu prostego, bez korzystania z instrukcji zwracającej wartość. Jak definiujemy sobie funkcję dodającą wartość do liczby całkowitej w standardowy sposób:

void Add(int v, int n)
{
	v += n;
}

modyfikacja będzie obowiązywać tylko w obrębie funkcji i to jest przekazywanie przez kopię. A jak dodamy jedno z tytułowych słów kluczowych:

void Add(ref int v, int n)
{
	v += n;
}

to "odwracamy kartę" i nakładamy przekazywanie przez referencję. To znaczy, że modyfikacja zostanie utrwalona i liczba podana za parametr aktualny funkcji "wyjdzie" jako całkiem inna wartość, bez konieczności używania instrukcji "return"!

Tyle tytułem szybkiego wytłumaczenia o co z tym "come on" w ogóle. A teraz słówka, które mają z tym bezpośredni związek: "ref" i "out" w języku C#!

SŁOWO KLUCZOWE "REF"

Pierwszym z dwóch jaki chciałem opisać jest "ref", czyli skrót od "reference" (ang. odniesienie). To samo odniesienie, o którym Wam alarmowałem podczas wykładu o podstawach obiektowości. W kontekście przekazywania przez referencję, "przestawia się" na przekazywanie wartości w miejsce parametru nie jako kopia, ale jako ta sama wartość, która będzie poddawana bezpośrednim modyfikacjom przez instrukcje zawarte w środku funkcji.

Dam taki sam przykład umieszczony wyżej. Wyobraźmy sobie, że chcemy za pomocą funkcji dodać składnik do wartości typu "liczba całkowita". Aby to miało ręce i nogi, modyfikacja powinna pozostać w wartości nie tylko w środku, ale i na zewnątrz funkcji. Co się stanie jak zastosujemy tradycyjny zapis?

void Add(int v, int n)
{
	v += n;
}

Do parametru formalnego "value" zostanie dodany składnik "n", funkcja się zakończy a modyfikacja będzie nieważna i powstaje błędne koło. Wystarczy jedno dodatkowe słowo:

void Add(ref int v, int n)
{
	v += n;
}

i to diametralnie zmienia postać rzeczy. Wtedy każda liczba podstawiona pod "v" będzie podatna na trwałe modyfikacje i jak można się domyślić, dodanie składnika "n" spowoduje utrwalenie tej operacji na zewnątrz funkcji, po jej zakończeniu.

Warunkiem jaki stawia "ref" jest tylko zapewnienie, żeby wstawiany do wywołania funkcji parametr aktualny był poprzedzony tym samym słowem oraz żeby wartość była uprzednio zainicjowana (przypisanie dowolnej konkretnej wartości liczbie, do której ma zostać dodany składnik):

int x = 7;

Add(ref x, 80);
Console.WriteLine(x);

Jak się zaraz przekonacie, "ref" i "out" w języku C# dają ten sam efekt, tylko mają inne "żądania" :).

SŁOWO KLUCZOWE "OUT"

"out" również włącza przekazywanie przez referencję. Jedyna różnica jest taka, że wprowadzana zmienna może być za pierwszym razem niezainicjowana. Czyli możemy podać ją w takiej postaci:

int x;

Add(out x, 10);

albo w takiej:

int x = 9;

Add(out x, 10);

ale przypisanie wartości MUSI być zawarte w definicji funkcji (uwaga na słowo "out" tuż przed typem danych!):

void Add(out int v, int n)
{
	v = 0;
	v += n;
}

Czyli innymi słowy taka zmienna musi mieć przypisanie dowolnej wartości WEWNĄTRZ metody, bez względu na poprzednie posiadanie wartości.

Słowo kluczowe "ref" w języku C#
Słowo kluczowe "out" w języku C#

Słowa "ref" i "out" odnoszą się do "zamiany" przekazywania parametru przez kopię na przekazywanie parametru przez referencję. Język Java nie oferuje takiego bajeru!


Dobra, tyle! Dziękuję za przeczytanie i radzę Wam to opanować przynajmniej w stopniu podstawowym. "ref" i "out" w języku C#, poza wprowadzaniem do funkcji samego obiektu, to jedyna droga do przekazywania przez referencję. Nie każdy język posiada coś takiego.

PODOBNE ARTYKUŁY