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(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:

  • 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, 596 hits)


Podobne wpisy
Operatory konwersji implicit oraz explicit

Możesz śledzić odpowiedzi do tego wpisu za pomocą RSS 2.0 feed. Możesz leave a response, or trackback z Twojej własne strony.

1 Komentarz »

 
 

Dodaj komentarz

XHTML: Możesz użyć następujących tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*