10.04.2009

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(int parameter)
...
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 class Test
{
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ć:

static void Main ( string[] args )
{
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ą:

public static int Sum(params int[] list)
.....

W samym wykonaniu nie zmieniamy niczego. Jak teraz wywołamy metodę sumowania?

static void Main ( string[] args )
{
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:

  ParamsDemo - params (14,4 KiB, 473 hits)


Nie znaleziono podobnych wpisów.

Komentarze

  1. dotnetomaniak.pl on 10.28.2009

    C# params – tablice parametrów…

    Dziękujemy za publikację – Trackback z dotnetomaniak.pl…

Dodaj komentarz