Metody to funkcje zdefiniowane w klasie. C# obsługuje bogate możliwości parametrów — argumenty opcjonalne/nazwane, modyfikatory ref/out/in, tablice params — oraz (wiele metod o tej samej nazwie, ale z różnymi parametrami).
public int Add(int a, int b) => a + b; // expression-bodied (concise)
public string Greet(string name, string greeting = "Hello") // default parameter
{
return $"{greeting}, {name}";
}
Greet("Ann"); // "Hello, Ann"
Greet("Ann", greeting: "Hi"); // named argument
Metody określają typ zwracany, nazwę i parametry. Parametry domyślne czynią argumenty opcjonalnymi, a argumenty nazwane pozwalają na przekazywanie wartości po nazwie (bardziej czytelne, można pominąć opcjonalne).
// ref — pass by reference (method can modify the caller's variable)
void Increment(ref int x) { x++; }
int n = 5; Increment(ref n); // n is now 6
// out — for returning multiple values (must be assigned in the method)
bool TryParse(string s, out int result) { result = ...; return true; }
if (int.TryParse("42", out int value)) { } // the common TryX pattern
// in — pass by reference but READ-ONLY (performance for large structs)
void Process(in LargeStruct data) { }
out jest powszechnie używane w wzorcu TryParse (zwracanie flagi powodzenia oraz wyniku w bezpieczny sposób); ref umożliwia modyfikowanie zmiennej wywołującego; in przekazuje duże struktury wydajnie bez kopiowania.
// params — variable number of arguments
int Sum(params int[] numbers) => numbers.Sum();
Sum(1, 2, 3, 4); // any number
// OVERLOADING — same name, different parameters
void Print(int x) { }
void Print(string s) { }
void Print(int x, int y) { }
Print(5); // calls the int version — resolved by argument types
Przeciążanie pozwala wielu metodom dzielić nazwę, rozróżniane po typach/liczbie parametrów — kompilator wybiera pasującą. params akceptuje zmienną liczbę argumentów.
Metody są podstawowymi blokami budulcowymi zachowania w C#, a zrozumienie ich bogatych możliwości parametrów jest istotne dla pisania elastycznego i wyrazistego kodu.
Wiedza na temat definiowania metod (w tym zwięzłej składni wyrażeniowej), używania parametrów domyślnych i nazwanych (dla argumentów opcjonalnych i czytelnych wywołań) oraz stosowania przeciążania metod (ta sama nazwa, różne parametry — dla intuicyjnych API obsługujących różne typy argumentów) to codzielna wiedza.
Modyfikatory parametrów są szczególnie ważne do zrozumienia: out jest powszechnie używane w wszechobecnym wzorcu TryParse (int.TryParse(s, out var result) — bezpiecznie zwracające flagę powodzenia i wynik bez wyjątków, typowy, idiomatyczny wzorzec C#), ref umożliwia modyfikowanie zmiennej wywołującego, a in przekazuje duże struktury przez referencję dla wydajności.
Zrozumienie tych zagadnień — metod, możliwości parametrów (opcjonalne/nazwane/params), przeciążania dla elastycznych API oraz modyfikatorów ref/out/in (szczególnie idiomatycznego wzorca opartego na out-TryX) — jest fundamentalne zarówno dla pisania metod w C# jak i dla korzystania z wielu API .NET, które opierają się na tych funkcjach.
Ponieważ metody i ich parametry są centralne dla całego kodu C#, a funkcje takie jak przeciążanie, parametry opcjonalne i wzorzec TryX pojawiają się stale, opanowanie ich jest podstawową, niezbędną wiedzą dla efektywnego rozwoju w C#.