This article has been localized into Polish by the community.
Parametry funkcji
W poprzednim rozdziale przyjrzeliśmy się funkcjom. Omówiliśmy pokrótce parametry, ale tylko pokrótce :). Chociaż parametry są bardzo zwyczajne i proste w użyciu. Istnieją jednak sztuczki, które mogą uczynić je o wiele potężniejszymi.
Pierwszą rzeczą, na którą zwrócimy uwagę, są modyfikatory out i ref. C# i inne języki również różnią się między dwoma parametrami: "by value" (według wartości) i "by reference" (przez odniesienie). Domyślnie w C# używane jest "by value", co w zasadzie oznacza, że po przekazaniu zmiennej do wywołania funkcji, faktycznie wysyłasz kopię obiektu, zamiast odniesienia do niego. Oznacza to również, że możesz wprowadzić zmiany do parametru z wnętrza funkcji, bez wpływu na oryginalny obiekt, który przekazałeś jako parametr.
Za pomocą słowa kluczowego ref i out możemy zmienić to zachowanie, więc przekazujemy odniesienie do obiektu zamiast jego wartości.
Modyfikator ref
Rozważmy następujący przykład:
static void Main(string[] args)
{
int number = 20;
AddFive(number);
Console.WriteLine(number);
Console.ReadKey();
}
static void AddFive(int number)
{
number = number + 5;
}
Tworzymy zmienną jako liczbę całkowitą (int) i przypisujemy do niej 20. Następnie używamy metody AddFive(), która powinna dodać 5 do naszej liczby. Ale czy na pewno to robi? Nie. Wartość, którą przypisujemy do liczby wewnątrz funkcji, nigdy nie jest wykonywana z funkcji, ponieważ przekazaliśmy kopię wartości liczbowej zamiast odniesienia do niej. Tak po prostu to działa. W wielu przypadkach w C# jest to preferowany wynik. Jednak w tym przypadku tak naprawdę chcemy zmodyfikować numer wewnątrz naszej funkcji. Dodajmy teraz słowo kluczowe ref:
static void Main(string[] args)
{
int number = 20;
AddFive(ref number);
Console.WriteLine(number);
Console.ReadKey();
}
static void AddFive(ref int number)
{
number = number + 5;
}
Jak widzisz, wszystko, co zrobiliśmy, to dodanie słowa ref do deklaracji funkcji, a także do funkcji wywołania. Jeśli uruchomisz teraz program, zobaczysz, że wartość zmiennej number zmieniła się po wykonaniu zadań w funkcji.
Modyfikator out
Modyfikator out działa podobnie do modyfikatora ref. Obydwa zapewniają, że parametr jest przekazywany przez odniesienie zamiast przez wartość, ale mają dwie ważne różnice: Wartość przekazana do modyfikatora ref musi zostać zainicjowana przed wywołaniem metody - trochę inaczej działa modyfikator out, gdzie możesz użyć niezainicjowanych wartości. Z drugiej strony nie można opuścić wywołania funkcji z parametrem out, bez przypisywania do niego wartości. Ponieważ można przekazywać niezainicjowane wartości jako parametr wyjściowy, nie można w rzeczywistości użyć parametru out w funkcji - można mu tylko przypisać nową wartość.
To, czy używać out, czy ref, naprawdę zależy od sytuacji. Zdasz sobie z tego sprawę, kiedy zaczniesz ich używać. Oba modyfikatory są zwykle używane do obejścia problemu polegającego na tym, że zwracają jedną wartość z funkcji, przy pomocy C#.
Używanie modyfikatora out jest jak użycie modyfikatora ref, jak pokazano powyżej. Po prostu zmień słowo kluczowe ref na słowo kluczowe out. W powyższym przykładzie pamiętaj również, aby usunąć wartość przypisaną do liczby w metodzie i zadeklarować ją w funkcji połączenia.
Modyfikator params
Do tej pory wszystkie nasze funkcje zaakceptowały ustaloną ilość parametrów. Jednak w niektórych przypadkach może być potrzebna funkcja, która pobiera dowolną liczbę parametrów. Można to oczywiście zrobić, ustawiając tablicę lub listę jako parametr, na przykład:
static void GreetPersons(string[] names) { }
Jednak wywoływanie go byłoby trochę niezręczne. W najkrótszej formie wyglądałoby to tak:
GreetPersons(new string[] { "John", "Jane", "Tarzan" });
Jest to akceptowalne, ale można uczynić też metodę "mądrzejszą" - przy użyciu słowa kluczowego params:
static void GreetPersons(params string[] names) { }
Wywoływanie takiej metody wyglądałoby następująco:
GreetPersons("John", "Jane", "Tarzan");
Kolejną zaletą zastosowania podejścia params jest to, że możesz również przekazywać do niego parametry zerowe. Funkcje z parametrami mogą nawet przyjmować inne parametry, o ile parametr ze słowem kluczującym params jest ostatnim. Co najważniejsze - tylko jeden parametr wykorzystujący słowo kluczowe params może być użyty na pojedynczą funkcję. Oto ostatni i pełniejszy przykład:
static void Main(string[] args)
{
GreetPersons(0);
GreetPersons(25, "John", "Jane", "Tarzan");
Console.ReadKey();
}
static void GreetPersons(int someUnusedParameter, params string[] names)
{
foreach(string name in names)
Console.WriteLine("Hello, " + name);
}
This article has been deprecated!
This article has been re-organized and updated to better match the rest of the tutorial.
We suggest that you read this article instead: Method parameters