Sobes.tech
Junior

Šta su delegati u C# i zašto se koriste?

sobes.tech АИ

Одговор од АИ

Delegati u C# su tipovski bezbedni pokazivači na metode. Oni inkapsuliraju metodu, omogućavajući joj da se prosledi kao parametar ili koristi kao tip promenljive.

Koriste se za:

  • Implementaciju obrasca posmatrača (Observer): Događaji u C# se zasnivaju na delegatima. Pošiljalac obaveštava pretplatnike pozivom delegata.
  • Callback-ove: Prosleđivanje metode kao argumenta funkciji koja će je kasnije pozvati.
  • Generičko programiranje: Delegati Action i Func omogućavaju kreiranje opštih metoda koji rade sa različitim potpisima.
  • Paralelno i asinhrono programiranje: Metode za izvršavanje u drugim nitima ili asinhrono često se prosleđuju putem delegata.
  • LİNQ: LINQ operatori aktivno koriste delegate za definisanje uslova filtriranja, transformacije itd.

Primer deklaracije i korišćenja delegata:

// Deklaracija delegata sa potpisom void i jednim argumentom tipa int
public delegate void MyDelegate(int x);

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

    public static void Main(string[] args)
    {
        // Kreiranje instance delegata koja pokazuje na metodu PrintNumber
        MyDelegate del = new MyDelegate(new MyClass().PrintNumber);

        // Pozivanje metode putem delegata
        del(10);
    }
}

Primer sa Action (za void metode bez povratne vrednosti):

using System;

public class OtherClass
{
    public void ExecuteAction(Action action)
    {
        action(); // Izvršava prosleđeni delegat
    }

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

Primer sa Func (za metode sa povratnom vrednošću):

using System;

public class ThirdClass
{
    public int Calculate(Func<int, int, int> operation, int a, int b)
    {
        return operation(a, b); // Izvršava prosleđenu operaciju i vraća 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($"Rezultat sabiranja: {result}");
    }
}