Ta lekcja jest króciutka i prosta, tyczy się ona słów kluczowych ref i out. Zaczniemy od ref. Czasem będziesz chciał przesłać do metody nie kopię wartości jako argument, a całą referencję do obiektu, co to oznacza, że każda zmiana dokonana na parametrze m metodzie, będzie widoczna poza nią. Trochę to zapewnie nie zrozumiałe dla ciebie, ale już przechodzimy do praktyki, ale jeszcze ogólnikowa deklaracja ref:
specyfikator_dostępu typ_zwracany nazwa_metody(ref typ_parametru1 nazwa_parametru1,…)
{
…
}
Ok. większość informacji powyżej jest dla ciebie jasna, jedyną nowością jest ref, otóż umieszczamy go przed typem parametru, może ich być tyle co parametrów. Jak działa ref w praktyce prześledź sobie na poniższym prostym przykładzie:
Początek kodu:
using System;
class Automat
{
public void Kawa(ref double cena, int dawek_cukru)
{
if (dawek_cukru > 0 & dawek_cukru < 3)
cena += 0.98;
else if (dawek_cukru > 3)
cena += 2.30;
}
}
class Pokaz
{
public static void Main()
{
double kasa = 0.0;
string wybor;
Automat automat1 = new Automat();
Console.WriteLine(„Wybierz jaką kawę chcesz:\n1 – Mała kawa\n2 – Średnia kawa\n3 – Duża kawa”);
wybor = Console.ReadLine();
switch (wybor)
{
case „1″:
kasa += 3.56;
break;
case „2″:
kasa += 4.71;
break;
case „3″:
kasa += 5.22;
break;
default:
Console.WriteLine(„*ZŁY WYBÓR* wybrano kawa średnia”);
goto case „2″;
}
Console.WriteLine(„\nIle dawek cukru\n1\n3\n4″);
wybor = Console.ReadLine();
switch (wybor)
{
case „1″:
automat1.Kawa(ref kasa, 1);
break;
case „3″:
automat1.Kawa(ref kasa, 3);
break;
case „4″:
automat1.Kawa(ref kasa, 4);
break;
default:
Console.WriteLine(„*ZŁY WYBÓR* wybrano kawa 2″);
automat1.Kawa(ref kasa, 2);
break;
}
Console.WriteLine(„\n\nDo zapłaty: ” + kasa);
}
}
Koniec kodu:
Nasz powyższy program to symulator automatu do kawy. Tworzymy klasę automat, która zawiera metodę Kawa() która to ma za zadanie zmienienie zmiennej cenna, a dokładnie dodanie do niej odpowiedniej należności za kawę, dzięki słowu ref, bezpośrednio operujemy na referencji czyli za zmiennej z Pokaz, każda zmiana dokonana na zmiennej kasa w metodzie Kawa() będzie dokonana na zmiennej kasa z klasy Pokaz. Jak widzisz przesyłamy referencję, a nie kopiujemy wartość. W metodzie gdy jej używamy musimy napisać ref przed zmienną którą przesyłamy do metody: automat1.Kawa(ref kasa, 1); Oczywiście możesz sobie napisać jeszcze bardziej prostszy program niż ten, aby zobaczyć jak dokładnie działa ref, chociaż działanie ref, już nie powinno być dla ciebie tajemnicą.
Out jest bardzo podobne działaniem do ref, deklaracja wygląda tak samo, różnica w działaniu jest taka że out służy do nadawania wartości, przesyłając coś do metody za pomocą out mamy pewność, że po wykonaniu metody argument będzie miał nadaną wartość, jest to bardzo pożyteczne bo często są takie sytuację, że kompilator musi mieć wartość zmiennej, lub obiektu, out bardzo ułatwia nam pracę. O.K teraz napiszemy prosty program, bardzo prosty, aby ci tylko ukazać jak działa out. Nasz program będzie posiadał zmienną string siec, w której będzie zawierał informację czy jakieś łącze jest otwarte.
Początek kodu:
using System;
class Ftp1
{
public void Przeslanie_pakietu1(out string s)
{
Console.WriteLine(„przesyłanie pakietu1 powiodło się…”);
s = „Zamknięte”;
}
}
class Pokaz
{
public static void Main()
{
string stan;
Ftp1 p = new Ftp1();
p.Przeslanie_pakietu1(out stan);
Console.WriteLine(stan);
}
}
Koniec kodu:
Jak sam widzisz prosty program, jeżeli byś my nie wywołali metody Przesylasnie_pakietu1() w klasie Pokaz, to mieli byś my zgłoszony przez kompilator błąd podczas wywołania stan, za pomocą Console.WriteLine(), oraz jeżeli byś my w metodzie przesyłanie_pakietu1() nie nadali zmiennej s wartości tez mieli byś my zgłoszony błąd. Jeżeli czegoś nie zrozumiałeś, prześledź sobie sam działanie ref i out na własnych programach krok po kroku.