0Pricing
C# Academy · Lekcja

Metody generyczne

Parametry typów w metodach.

Metody generyczne to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Czym są metody generyczne?

Metoda generyczna deklaruje jeden lub więcej własnych parametrów typu, zapisywanych w nawiasach ostrych po nazwie metody. To samo ciało metody działa następnie dla wielu typów bez rzutowania ani powielania kodu.

Parametry typu są symbolami zastępczymi, takimi jak T. Kompilator podstawia rzeczywisty typ w miejscu wywołania, zachowując pełne bezpieczeństwo typów.

void Print<T>(T value)
{
    Console.WriteLine(value);
}

Deklarowanie parametru typu

Lista parametrów typu <T> znajduje się między nazwą metody a listą parametrów. Wewnątrz ciała metody można używać T jako typu parametru, typu zwracanego lub typu zmiennej lokalnej.

Zgodnie z konwencją pojedyncze parametry typu noszą nazwę T; często używa się również nazw opisowych, takich jak TKey.

T Echo<T>(T input)
{
    return input;
}

Wywoływanie z inferencją typów

Zwykle nie określa się jawnie argumentu typu. Kompilator wywnioskuje T na podstawie przekazanych argumentów.

W tym przypadku Echo(42) oznacza T = int, a Echo("hi") oznacza T = string. Inferencja typów sprawia, że wywołania generyczne są przejrzyste i czytelne.

using System;

class Program
{
    static T Echo<T>(T input) => input;

    static void Main()
    {
        Console.WriteLine(Echo(42));
        Console.WriteLine(Echo("hi"));
    }
}

Jawne argumenty typu

Jeśli inferencja nie pozwala określić typu albo chcesz określić go jawnie, podaj argument typu w nawiasach ostrych w miejscu wywołania.

Jest to wymagane, gdy żaden argument nie zawiera informacji o typie, na przykład w przypadku metody, w której T występuje tylko w typie zwracanym.

T Create<T>() where T : new() => new T();

// call:
var list = Create<int>();

Wiele parametrów typu

Metoda generyczna może deklarować kilka parametrów typu oddzielonych przecinkami. Każdy z nich jest wywnioskowywany lub podawany niezależnie.

Klasycznym przykładem jest zamiana miejscami dwóch wartości albo konstruktor pary, który łączy dwa różne typy.

(TSecond, TFirst) Flip<TFirst, TSecond>(TFirst a, TSecond b)
{
    return (b, a);
}

Generyczna zamiana miejscami

Metody generyczne świetnie sprawdzają się w narzędziach, które nie zależą od konkretnego typu. Zamiana miejscami pozwala przestawić dwie wartości dowolnego zgodnego typu.

Słowo kluczowe ref pozwala metodzie modyfikować zmienne wywołującego bezpośrednio.

using System;

class Program
{
    static void Swap<T>(ref T a, ref T b)
    {
        T temp = a;
        a = b;
        b = temp;
    }

    static void Main()
    {
        int x = 1, y = 2;
        Swap(ref x, ref y);
        Console.WriteLine($"{x} {y}");
    }
}

Ograniczenia parametrów metody

Metoda generyczna może ograniczać swoje parametry typu za pomocą klauzuli where. Ograniczenia informują kompilator, jakie operacje na T są dozwolone.

W poniższym przykładzie where T : IComparable<T> pozwala bezpiecznie wywołać CompareTo w treści metody.

T Max<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) >= 0 ? a : b;
}

Metody generyczne w klasach niegenerycznych

Klasa nie musi być generyczna, aby zawierać metody generyczne. Często umieszcza się je w statycznych klasach narzędziowych.

Dzięki temu pomocnicze elementy ogólnego przeznaczenia można grupować bez zmuszania całej klasy do przechowywania parametru typu.

static class Util
{
    public static T First<T>(T[] items) => items[0];
}

Inferencja z tablic

Inferencja typów działa również w przypadku argumentów będących tablicami i kolekcjami. Przekazanie int[] automatycznie wywnioskuje T = int.

Dzięki temu algorytmy generyczne przypominają funkcje wbudowane w język.

using System;

class Program
{
    static T First<T>(T[] items) => items[0];

    static void Main()
    {
        int[] nums = { 10, 20, 30 };
        Console.WriteLine(First(nums));
    }
}

Dlaczego nie użyć po prostu object?

Przed wprowadzeniem generyczności kod używał object i rzutowań. Powoduje to utratę bezpieczeństwa typów oraz boxing typów wartości, co pogarsza wydajność.

Metody generyczne unikają boxingu typów wartości i wykrywają pomyłki typów podczas kompilacji, zamiast zgłaszać wyjątki w czasie działania.

// Unsafe: needs a cast and can fail at runtime
object Echo(object o) => o;
int n = (int)Echo(5);

Zwracanie różnych typów

Typ zwracany również może być generyczny, dzięki czemu jedna metoda może dostosować kształt wyniku do wywołującego. default(T) zwraca wartość zerową dla typów wartości lub null dla typów referencyjnych.

Jest to przydatne przy tworzeniu bezpiecznych wartości zastępczych, gdy żadna wartość nie jest dostępna.

T OrDefault<T>(bool ok, T value)
{
    return ok ? value : default(T);
}

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat metod generycznych.

Podsumowanie

Metody generyczne deklarują własne parametry typu w nawiasach ostrych umieszczonych za nazwą. Kompilator zwykle wywnioskuje typ na podstawie argumentów, ale można też podać go jawnie.

Metody te zachowują bezpieczeństwo typów, unikają boxingu i mogą zawierać ograniczenia where. Można umieszczać je w dowolnej klasie, generycznej lub nie.

Często zadawane pytania

Czy lekcja „Metody generyczne” jest bezpłatna?

Tak — pełny tekst „Metody generyczne” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Metody generyczne”?

Parametry typów w metodach. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Metody generyczne”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Metody generyczne
  2. Klasy generyczne
  3. Ograniczenia where
  4. Interfejsy generyczne
← Powrót do C# Academy