TOC

This article has been localized into Polish by the community.

Podstawy:

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 fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!