Strona główna » Kursy » Kurs C# » Przesyłanie Argumentów
 

Przesyłanie Argumentów

Wstęp

W językach programowania wysokiego poziomu program składa się z funkcji. Każda z nich może przyjmować argumenty określone przez programistę. Istnieje kilka sposobów na przesyłanie argumentów do funkcji. Każda z nich może znaleźć zastosowanie podczas pisania programu.

Implementacja

Standardowe przesyłanie

Dotychczas przedstawione przesyłanie argumentów polegało na podaniu ich w postaci par typ × nazwa. Podczas takiego wywołania tworzone są kopie przesyłanych danych. Z tego powodu ich modyfikacja nie wpływa na przesyłane dane, więc istnieje potrzeba zwrócenia wyniku. Ograniczeniem takiego rozwiązania jest możliwość zwrócenia tylko jednej wartości określonego typu. Przykładowa funkcja Sumuj() wygląda następująco:

  1. static int Sumuj(int a, int b) {
  2.   return a + b;
  3. }

Przykładowo funkcja Sumuj() akceptuje dwa argumenty a i b. Funkcja została określona, że zwraca typ int. W tym przypadku zwracana jest (2.) suma podanych argumentów. Tego typu funkcję można wywołać nastepująco:

  1.   int a = 3, b = 6;
  2.   int suma = Sumuj(a, b);

Istnieje jeszcze możliwość przesłania konkretnych stałych wartości (albo przesłać niektóre argumentymi za pomocą zmiennych, a niektóre za pomocą stałych):

  1.   int suma2 = Sumuj(3, 6);

Przesyłanie przez referencje

W celu przesłania argumentu przez referencje należy przed argumentem dodać słowo kluczowe ref zarówno w nagłówku funkcji jak również w miejscu określenia argumentów podczas wywołania funkcji. Dzięki temu modyfikacje zmiennych wewnątrz funkcji będą widoczne poza nią. Wadą tego rozwiązania jest fakt, że stałe nie mogą być argumentami w takiej funkcji. Należy pamiętać, że to programista decyduje, które argumenty mają być przesłane przez referencje.

W poniższym przykładzie argumenty są przesyłane przez referencje:

  1. static void Sumuj(ref int a, ref int b) {
  2.   a += b;
  3. }

Ze względu na to, że możliwa jest zmiana wartości zmiennej a i b to wynik zostaje zapisany do zmiennej a. Zmienia to zastosowanie funkcji, ponieważ teraz nie otrzymujemy wyniku jako następną wartość, a nadpisuje ona jeden ze składników. Czasem w ramach oszczędności pamięci takie zabiegi są stosowane.

Tego typu funkcję można wywołać jedynie poprzez podanie zmiennych, ponieważ stałe nie miałyby określonego miejsca, które funkcja może zmodyfikować.

  1.   int a = 3, b = 6;
  2.   Sumuj(ref a, ref b);

Parametr wyjściowy

Podczas standardowego przesyłania argumentów możliwe jest zwrócenie jednego wyniku. Częściowo ten problem rozwiązało przesyłanie przez referencję, ale należay pamiętać, że zwrócenie wyniku oznacza modyfikację co najmniej jednego z przesyłanych argumentów.

Rozwiązaniem zwracania kilku wartości jako wynik jest parametr wyjściowy. Deklaruje się go podobnie jak przesyłanie przez referencję, ale używa się słowa kluczowego out. Zmienna tego typu przed zakończeniem wykonywania funkcji musi zostać zmodyfikowana. Zmiany wprowadzone na zmiennej typu out są widoczne na zewnątrz. Tylko wybrane argumenty mogą być typu out, a pozostałe mogą być innymi typami argumentów.

W poniższym przykładzie trzeci argument suma jest parametrem wyjściowym do którego zostanie przypisana suma a i b:

  1. static void Sumuj(int a, int b, out int suma) {
  2.   suma = a + b;
  3. }

Podane rozwiązanie jest możliwe do zrealizowania używając do tego przesyłania przez referencję. Warto tutaj pamiętać, że w przypadku użycia out kompilator podpowie jeśli wynik nie został przypisany do paramatru wyjściowego.

Oto przykładowe wywołanie funkcji Sumuj() z parametrem wyjściowym używając zmiennych:

  1.   int a = 3, b = 6;
  2.   int suma;
  3.   Sumuj(a, b, out suma);

Ze względu na to, że pierwsze argumenty nie są typu ref lub out to można w ich miejsce podać stałe, ale nie dotyczy to zmiennej suma typu out, która musi być wcześniej zadeklarowaną zmienną!

  1.   Sumuj(3, 6, out suma);

Nieznana ilość argumentów

Jednak czy zawsze funkcje muszą mieć z góry określoną ilość argumentów? Niekoniecznie. Funkcja Sumuj() mogłaby posłużyć do sumowania dowolnej ilości argumentów typu int. Jednak deklarowanie funkcji dla różnych ilości argumentów byłoby bardzo długie, monotonne i powielało niwiele zmieniony kod wiele razy. Rozwiązaniem jest tutaj modyfikator zmiennej params.

Słowo kluczowe params oznacza, że programista może przesłać nieokreśloną z góry ilość argumentów typu jaki ma modyfikowana zmienna. Należy tutaj pamiętać, że tym słowem kluczowym może zostać objęta jedynie ostatnia zmienna i tylko jedna! Argumenty są następnie widziane jako tablica danych określonego typu. W celu zadeklarowania zmiennej z modyfikatorem params należy dopisać go przed typem zmiennej, a po typie dopisać nawiasy kwadratowe '[ ]'.

W poniższym przykładzie została przedstawiona funkcja Sumuj(), która pozwala na zsumowanie dowolnej ilości argumentów:

  1. static int Sumuj(params int[] dane) {
  2.   int suma = 0;
  3.   foreach (int a in dane)
  4.     suma += a;
  5.   return suma;
  6. }

(2.) Na początku suma danych wynosi 0, a następnie (3. - 4.) dodawane są do niej kolejne wartości przesłane jako argumenty. Na koniec (5.) zwracana jest obliczona suma.

Oto przykładowe wywołanie funkcji Sumuj() dla kilku zmiennych:

  1.   int a = 3, b = 6, c = 7;
  2.   int suma = Sumuj(a, b, c);

I inny przykład wywołania dla kilku stałych:

  1.   suma = Sumuj(1, 2, 3, 4, 5);
Zadania
Zadanie 1
Kod źródłowy Zadanie 1Kod źródłowy Zadanie 1