Sobes.tech
Junior

Cosa sono i delegati in C# e a cosa servono?

sobes.tech AI

Risposta dell'AI

I delegati in C# sono puntatori sicuri di tipo ai metodi. Incapsulano un metodo, permettendo di passarli come parametro o usarli come tipo di variabile.

Vengono usati per:

  • Implementazione del pattern osservatore (Observer): Gli eventi in C# si basano sui delegati. L'emittente notifica gli iscritti chiamando il delegato.
  • Callback: Passare un metodo come argomento a una funzione che lo chiamerà più tardi.
  • Programmazione generica: I delegati Action e Func permettono di creare metodi generici che lavorano con diverse firme.
  • Programmazione parallela e asincrona: I metodi per eseguire in altri thread o in modo asincrono sono spesso passati tramite delegati.
  • LİNQ: Gli operatori LINQ usano attivamente i delegati per definire condizioni di filtro, trasformazione, ecc.

Esempio di dichiarazione e utilizzo di un delegato:

// Dichiarazione di un delegato con firma void e un argomento di tipo int
public delegate void MyDelegate(int x);

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

    public static void Main(string[] args)
    {
        // Creazione di un'istanza del delegato che punta al metodo PrintNumber
        MyDelegate del = new MyDelegate(new MyClass().PrintNumber);

        // Chiamata del metodo tramite il delegato
        del(10);
    }
}

Esempio con Action (per metodi void senza valore di ritorno):

using System;

public class OtherClass
{
    public void ExecuteAction(Action action)
    {
        action(); // Esegue il delegato passato
    }

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

Esempio con Func (per metodi con valore di ritorno):

using System;

public class ThirdClass
{
    public int Calculate(Func<int, int, int> operation, int a, int b)
    {
        return operation(a, b); // Esegue l'operazione passata e restituisce il risultato
    }

    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($"Risultato della somma: {result}");
    }
}