Przekazywanie
parametrów do metod
W języku C# istnieją trzy sposoby przekazywania parametrów do metod: przez wartość, przez referencję oraz przez wartość i referencję. Każdy z tych sposobów ma swoje wady i zalety i może być używany w zależności od potrzeb programu.
Parametry typu Wartościowego
Parametry typu wartościowego są przekazywane do funkcji lub metody jako kopia wartości, a nie jako referencja do oryginalnego obiektu. Oznacza to, że wewnątrz funkcji można dokonywać zmian na kopii wartości przekazanej jako argument, ale nie mają one wpływu na oryginalny obiekt.
using System;
class Program
{
static void Main(string[] args)
{
// Przekazanie zmiennej typu int wartość 100
int a = 100;
Console.WriteLine("Przed wywołaniem metody: a = {0}", a);
Zmien(a);
Console.WriteLine("Po wywołaniu metody: a = {0}\n", a);
// Przekazanie zmiennej typu bool przez wartość
bool c = true;
Console.WriteLine("Przed wywołaniem metody: c = {0}", c);
Zmien(c);
Console.WriteLine("Po wywołaniu metody: c = {0}", c);
}
static void Zmien(int x)
{
x++;
}
static void Zmien(bool x)
{
x = !x;
}
}
Przed wywołaniem metody: a = 100
Po wywołaniu metody: a = 100
Przed wywołaniem metody: c = True
Po wywołaniu metody: c = True
Wewnątrz metody mamy do czynienia z kopią argumentu, a nie z oryginalnym obiektem. Zmiany wprowadzone w obiekcie wewnątrz metody nie wpływają na oryginalny obiekt poza metodą.
Parametry typu Referencyjnego
Parametry typu referencyjnego są przekazywane do funkcji lub metody jako referencja do oryginalnego obiektu, a nie jako kopia wartości. Oznacza to, że zmiany wprowadzone do referencji wewnątrz funkcji mają wpływ na oryginalny obiekt przekazany jako argument.
using System;
class Program
{
static void Main(string[] args)
{
Test t1 = new Test(); // Utworzenie obiektu klasy Test
t1.x = 10;
t1.y = 20;
// Przekazanie obiektu przez referencję
Console.WriteLine("Przed wywołaniem metody: t1.x = {0}, t1.y = {1}\n", t1.x, t1.y);
Zmien(ref t1);
Console.WriteLine("Po wywołaniu metody: t1.x = {0}, t1.y = {1}", t1.x, t1.y);
}
// Metoda z parametrem typu referencyjnego
static void Zmien(ref Test t)
{
t.x++;
t.y++;
}
}
// Klasa Test z polami x i y typu int
class Test
{
public int x;
public int y;
}
Przed wywołaniem metody: t1.x = 10, t1.y = 20
Po wywołaniu metody: t1.x = 11, t1.y = 21
Parametr referencyjny jest definiowany przez użycie słowa kluczowego ref. Wewnątrz metody mamy bezpośredni dostęp do oryginalnego obiektu i jakiekolwiek zmiany wprowadzone w obiekcie wewnątrz metody wpływają na oryginalny obiekt poza metodą.
Parametry typu Wyjściowego
Parametry typu wyjściowego są używane, gdy funkcja musi zwrócić więcej niż jedną wartość, a wartości te nie mogą być zwracane przez wartość zwracaną funkcji lub przez zmianę stanu obiektu.
using System;
class Program
{
static void Main(string[] args)
{
int wynik; // Zmienna, do której będzie przypisany wynik działania
Podziel(15, 3, out wynik); // Wywołanie metody z parametrem typu wyjściowego
Console.WriteLine("Wynik: {0}", wynik); // Wyświetlenie wyniku
}
// Metoda z parametrem typu wyjściowego
static void Podziel(int a, int b, out int wynik)
{
wynik = a / b;
}
}
parametry typu wyjściowego muszą być zainicjowane wewnątrz metody, a ich wartość musi być przypisana przed opuszczeniem metody. W przeciwnym razie program wygeneruje wyjątek typu InvalidOperationException.