Sobes.tech
Junior

Ce sunt delegații în C# și pentru ce sunt folosiți?

sobes.tech AI

Răspuns de la AI

Delegatii în C# sunt pointeri siguri de tip către metode. Ei încapsulează o metodă, permițându-i să fie transmisă ca parametru sau utilizată ca tip de variabilă.

Sunt folosiți pentru:

  • Implementarea pattern-ului observator (Observer): Evenimentele în C# se bazează pe delegați. Emitentul notifică abonații apelând delegatul.
  • Callback-uri: Transmiterea unei metode ca argument către o funcție care o va apela mai târziu.
  • Programare generică: Delegatii Action și Func permit crearea de metode generice care funcționează cu diferite semnături.
  • Programare paralelă și asincronă: Metodele pentru execuție în alte thread-uri sau asincron sunt adesea transmise prin delegați.
  • LİNQ: Operatorii LINQ utilizează activ delegați pentru a defini condiții de filtrare, transformare etc.

Exemplu de declarație și utilizare a unui delegat:

// Declararea unui delegat cu semnătura void și un argument de tip int
public delegate void MyDelegate(int x);

public class MyClass
{
    public void PrintNumber(int num)
    {
        Console.WriteLine($"Număr: {num}");
    }

    public static void Main(string[] args)
    {
        // Crearea unei instanțe de delegat care indică metoda PrintNumber
        MyDelegate del = new MyDelegate(new MyClass().PrintNumber);

        // Apelarea metodei prin delegat
        del(10);
    }
}

Exemplu cu Action (pentru metode void fără valoare de returnare):

using System;

public class OtherClass
{
    public void ExecuteAction(Action action)
    {
        action(); // Execută delegatul transmis
    }

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

Exemplu cu Func (pentru metode cu valoare de returnare):

using System;

public class ThirdClass
{
    public int Calculate(Func<int, int, int> operation, int a, int b)
    {
        return operation(a, b); // Execută operația transmisă și returnează rezultatul
    }

    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($"Rezultatul adunării: {result}");
    }
}