Sobes.tech
Junior

Kas yra delegatas C#?

sobes.tech AI

Atsakymas iš AI

Delegatas yra nuorodinis tipas, deklaruotas naudojant raktinį žodį delegate. Jis inkapsuliuoja metodą su tam tikru signatu (grąžinamojo tipo ir parametrų tipais). Iš esmės, delegatas yra tipais saugus metodų rodyklė.

Pagrindinės delegatų savybės:

  • Metodų inkapsuliacija: Delegatas saugo informaciją apie metodą, į kurį jis nuoroda.
  • Tipų saugumas: Delegatas gali nuoroda tik į tuos metodus, kurių signatūra tiksliai atitinka delegato signatūrą.
  • Multicast: Delegatai gali nuoroda į kelis metodus vienu metu. Iškvietus delegatą, iškviečiami visi su juo susieti metodai jų pridėjimo tvarka.

Pavyzdys deklaracijai ir naudojimui:

// Delegato deklaravimas
public delegate int MyDelegate(int x, int y);

// Metodas, atitinkantis delegato signatūrą
public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

// Delegato naudojimas
public class Program
{
    public static void Main(string[] args)
    {
        Calculator calc = new Calculator();

        // Delegato pavyzdys sukūrimas ir susiejimas su Add metodu
        MyDelegate del = new MyDelegate(calc.Add);

        // Metodo iškvietimas per delegatą
        int result = del(5, 3);
        System.Console.WriteLine(result); // Išvestis: 8
    }
}

Su .NET Framework 3.5 ir LINQ atsiradimu, plačiai paplito įmontuoti generiniai delegatai:

  • Action<T1, ..., Tn>: Delegatas, kuris negrąžina reikšmės (void). Gali priimti nuo 0 iki 16 skirtingų tipų parametrų.
  • Func<T1, ..., Tn, TResult>: Delegatas, kuris grąžina reikšmę TResult. Gali priimti nuo 0 iki 16 skirtingų tipų parametrų.
  • Predicate<T>: Delegatas, kuris priima vieną parametrą T ir grąžina boolean reikšmę. Naudojamas sąlygų tikrinimui.

Lyginamoji lentelė su įmontuotais delegatais:

Delegatas Grąžinamosios reikšmės tipas Parametrai Pavyzdys naudojimo
Action void 0..16 parametrų Veiksmų vykdymas be grąžinamosios reikšmės
Func<TResult> TResult 0 parametrų + TResult grąžinimas Skaičiavimas be įvesties duomenų
Func<T, TResult> TResult 1 parametrą T + TResult grąžinimas Vertės konvertavimas
Predicate<T> bool 1 parametrą T Sąlygų tikrinimas

Delegatai plačiai naudojami įvykių apdorojimui, asinchroninėse operacijose, LINQ ir atgalinių skambučių įgyvendinimui.