C# params – tablice parametrów
Dotychczas, gdy potrzebowałem metod wykonujących te same zadania ale używających innych parametrów (czy choćby innej liczby parametrów), tworzyłem metody przeciążone. Wydawało mi się to naturalne i logiczne rozwiązanie. Do czasu, gdy przeczytałem o tablicach parametrów właśnie.
Metody, zawierające deklarację parametrów ze słowem kluczowym params, pozwalają na pobranie dowolnej liczby argumentów określonego typu.
Wspomniane przeciążanie jest bardzo przydatne, jednak nie sprawdza się we wszystkich przypadkach, na jakie możemy być „narażeni” ;-) Jednym z owych przypadków jest sytuacja, gdy nie zmienia się typ parametrów a jedynie ich liczba, której nie jesteśmy w stanie przewidzieć.
Książkowym przykładem jest systemowa funkcja WriteLine. Mamy kilka jej odmian:
...
public static void WriteLine(double parameter)
...
public static void WriteLine(decimal parameter)
...
Jak widać, każda pozwala na wypisanie na ekran zmiennej innego typu. Co w sytuacji, gdy mamy do wypisania dwie zmienne typu int? A trzy? Czy tworzyć w tym celu przeciążone metody, przyjmujące odpowiednią ich ilość? Trochę mija się to z celem i jest po prostu … nieładne ;)
W takich sytuacjach z pomocą przychodzą właśnie metody ze zmienną liczbą argumentów – pobierające tablicę parametrów zadeklarowane przy użyciu słowa kluczowego params.
Przykład
Jak to zwykle bywa na blogach, posłużę się przypadkiem nie wziętym z życia, bardzo prostym ale skutecznie (mam nadzieję) obrazującym zagadnienie ;-)
Cel: metoda wyliczająca sumę n-zmiennych typu int.
Wiadomo, że możemy rozwiązać nasz problem przy użyciu metody pobierającej tablicę typu int. Wyglądałoby to następująco:
{
public static int Sum ( int[] list )
{
int x = 0;
foreach ( int i in list )
{
x += i;
}
return x;
}
}
Wszystko pozornie wygląda ok. Jaki jest jednak mankament tego rozwiązania? Musimy wcześniej utworzyć tablicę ze zmiennych, które chcemy porównać:
{
int i = 5;
int j = 15;
int k = 23;
int[] array = new int[3];
array[0] = i;
array[1] = j;
array[2] = k;
int sum = Test.Sum( array );
}
Jak widać, wszystko wygląda zgrabnie. Czy aby na pewno? Musimy przecież za każdym razem tworzyć array tylko po to, by zrealizować sumowanie. Czemu nie przerzucić części roboty na kompilator? Zmieńmy więc deklarację metody sumowania na nową:
.....
W samym wykonaniu nie zmieniamy niczego. Jak teraz wywołamy metodę sumowania?
{
int i = 5;
int j = 15;
int k = 23;
int sum = Test.Sum( i, j, k );
}
Prawda, że mniej kodu? Tablica i tak zostanie zadeklarowana i zainicjowana naszymi zmiennymi, jednak zrobi to za nas kompilator.
Jak wszystkie rozwiązania, użycie params niesie za sobą kilka dość istotnych ograniczeń. Oto one:
- słowa params możemy używać tylko z tablicami jednowymiarowymi
- nie możemy przeciążać metody, która używa tylko tablicy z params
- nie możemy używać z params słów kluczowych ref i out
- jeśli metoda ma inne parametry, ten oznaczony jako params musi być ostatni
- w jednej metodzie można użyć tylko jednego artumentu oznaczonego params
- metody bez argumentu oznaczonego params mają zawsze wyższy priorytet niż te nim oznaczone
ParamsDemo - params (14,4 KiB, 473 hits)
Nie znaleziono podobnych wpisów.
Komentarze
Dodaj komentarz



dotnetomaniak.pl on 10.28.2009
C# params – tablice parametrów…
Dziękujemy za publikację – Trackback z dotnetomaniak.pl…