Zdarzyło Ci się potrzebować metody, która przyjmie zmienną (dowolną) liczbę argumentów? Być może chciałeś napisać funkcję sumującą nieograniczoną liczbę liczb lub wypisującą dowolną ilość komunikatów. W języku C# z pomocą przychodzi słowo kluczowe params. Pozwala ono definiować metody o elastycznej liczbie parametrów, dzięki czemu możemy wywołać taką metodę z różną liczbą argumentów – nawet, w skrajnym przypadku, z żadnym.
Co to jest params i kiedy się przydaje?
params to modyfikator parametru metody w C#. Ustawiając go przed typem parametru, wskazujemy, że metoda może otrzymać zmienną liczbę argumentów danego typu. W praktyce kompilator traktuje taki parametr jako tablicę. Każdy przekazany argument staje się elementem tej tablicy wewnątrz metody. To bardzo przydatne, gdy chcemy umożliwić wywołanie metody z dowolną liczbą argumentów, zamiast pisać osobne przeciążenia metody dla różnych ich ilości.
Kilka ważnych faktów o params:
- Można użyć tylko jednego parametru oznaczonego params w definicji metody i musi on być ostatnim parametrem na liście. Ewentualne inne parametry muszą znajdować się przed nim.
-Typem parametru params powinna być tablica jednowymiarowa określonego typu (np. int[], string[] itp.). W nowszych wersjach C# dopuszczalne są też niektóre inne kolekcje, ale najczęściej spotyka się tablice.
-Metodę z parametrem params można wywołać, przekazując do niej dowolną liczbę argumentów danego typu. Jeśli nie przekażemy żadnego argumentu, tablica wewnątrz metody będzie miała długość zero (czyli metoda nadal zadziała, tylko np. pętla po argumentach nie wykona się ani razu).
Na co dzień params jest używane w wielu metodach w .NET. Klasycznym przykładem jest choćby Console.WriteLine – ma ona przeciążenie: Console.WriteLine(string format, params object[] args). Dzięki temu możemy przekazać do niej dowolną liczbę wartości do sformatowania w napisie (i nawet różne typy, bo argumenty są typu object).
Jak używać params w praktyce? Przykład
Załóżmy, że chcemy napisać metodę, która policzy sumę nieokreślonej z góry liczby liczb całkowitych. Bez params moglibyśmy np. przekazywać tablicę int[] z liczbami do zsumowania albo definiować osobne przeciążenia metody dla 2, 3, 4... parametrów. Jednak z użyciem params rozwiązanie jest prostsze i bardziej elastyczne:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
{
total += n;
}
return total;
}Dzięki params powyższa metoda Sum może być wywołana na kilka sposobów:
-Sum(1, 2, 3); – przekazujemy trzy liczby (w tle zostaną one zapakowane do tablicy int[]).
-Sum(5, 10); – przekazujemy dwie liczby.
-Sum(); – wywołujemy metodę bez żadnych argumentów (wówczas numbers będzie pustą tablicą).
-int[] dane = {4, 8, 15, 16}; Sum(dane); – przekazujemy istniejącą tablicę liczb do metody.
Każde z tych wywołań jest poprawne. W efekcie wewnątrz metody Sum zmienna numbers zawsze jest tablicą int[], zawierającą wszystkie przekazane argumenty (lub pustą tablicą, jeśli wywołano ją bez argumentów). Pętla foreach przejdzie po niej i zsumuje wartości.
Warto zauważyć, że parametr params działa tylko na końcu listy parametrów. Jeśli metoda przyjmuje także inne, zwykłe parametry, muszą one wystąpić przed parametrem oznaczonym params. Przykładowo, podpis void Log(string message, params object[] values) jest prawidłowy – najpierw zwykły parametr message, a potem params dla dowolnej liczby dodatkowych wartości do zalogowania.
params przydaje się również, gdy chcemy przyjmować zmienną liczbę argumentów różnego typu. Wtedy możemy zadeklarować parametr jako params object[]. W ten sposób do tablicy można przekazać różne typy danych. Trzeba jednak pamiętać, że wewnątrz metody wszystkie te argumenty będą widziane jako obiekty (object), więc w razie potrzeby należy je rzutować na odpowiednie typy.
Podsumowanie
Słowo kluczowe params to proste, ale potężne narzędzie w C#, które ułatwia tworzenie elastycznych metod. Pozwala przekazywać dowolną liczbę argumentów bez konieczności pisania wielu przeciążeń czy ręcznego tworzenia tablic za każdym razem. Wystarczy poprawnie zadeklarować parametr params, a resztą zajmie się kompilator, przekazując wszystkie wartości w formie tablicy.
Jeśli dopiero zaczynasz przygodę z C#/.NET i chcesz szybko przejść od podstaw do pierwszej pracy jako młodszy programista .NET, zachęcam do sprawdzenia mojego szkolenia online "Zostań Programistą .NET". To kompletny program szkoleniowy, który pokazuje krok po kroku drogę od zera do młodszego programisty C#/.NET w 3 miesiące. Idealny dla początkujących, którzy chcą szybko i skutecznie wejść w świat programowania.