Sobes.tech
Junior

Kas yra delegatai C# ir kam jie naudojami?

sobes.tech AI

Atsakymas iš AI

C# delegatai yra tipui saugūs metodų nuorodos. Jie inkapsuliuoja metodą, leidžiantį jį perduoti kaip parametrą arba naudoti kaip kintamojo tipą.

Naudojami:

  • Stebėtojo (Observer) modelio įgyvendinimas: C# įvykiai grindžiami delegatais. Leidėjas praneša prenumeratoriams iškviesdamas delegatą.
  • Atgaliniai iškvietimai (Callbacks): Metodo perdavimas kaip funkcijos argumento, kuris vėliau jį iškvies.
  • Bendrojo programavimo: Action ir Func delegatai leidžia kurti bendrus metodus, dirbančius su įvairiomis signatūromis.
  • Lygiagretus ir asinchroninis programavimas: Metodai, vykdomi kituose srautuose arba asinchroniškai, dažnai perduodami per delegatus.
  • LİNQ: LINQ operatoriai aktyviai naudoja delegatus filtro sąlygoms, transformacijoms ir kt. apibrėžti.

Delegato deklaracija ir naudojimo pavyzdys:

// Delegato deklaracija su `void` signatūra ir vienu `int` argumentu
public delegate void MyDelegate(int x);

public class MyClass
{
    public void PrintNumber(int num)
    {
        Console.WriteLine($"Skaičius: {num}");
    }

    public static void Main(string[] args)
    {
        // Delegato pavyzdys, nurodantis į `PrintNumber` metodą
        MyDelegate del = new MyDelegate(new MyClass().PrintNumber);

        // Metodo iškvietimas per delegatą
        del(10);
    }
}

Pavyzdys su Action (void metodams):

using System;

public class OtherClass
{
    public void ExecuteAction(Action action)
    {
        action(); // vykdome perduotą delegatą
    }

    public static void Main(string[] args)
    {
        Action myAction = () => Console.WriteLine("Sveiki iš Action!");
        new OtherClass().ExecuteAction(myAction);
    }
}

Pavyzdys su Func (metodai su grąžinamosios reikšmės):

using System;

public class ThirdClass
{
    public int Calculate(Func<int, int, int> operation, int a, int b)
    {
        return operation(a, b); // vykdome perduotą operaciją ir grąžiname rezultatą
    }

    public static void Main(string[] args)
    {
        Func<int, int, int> add = (x, y) => x + y;
        int result = new ThirdClass().Calculate(add, 5, 3);
        Console.WriteLine($"Sudėtis rezultatas: {result}");
    }
}