Sobes.tech
Junior

Cos'è un delegato in C#?

sobes.tech AI

Risposta dell'AI

Un delegato è un tipo di riferimento dichiarato con la parola chiave delegate. Incapsula un metodo con una firma specifica (tipo di ritorno e tipi di parametri). In sostanza, un delegato è un puntatore sicuro a un metodo.

Proprietà principali dei delegati:

  • Incapsulamento dei metodi: Il delegato memorizza informazioni sul metodo a cui fa riferimento.
  • Sicurezza di tipo: Il delegato può fare riferimento solo a metodi la cui firma corrisponde esattamente a quella del delegato.
  • Multicast: I delegati possono fare riferimento a più metodi contemporaneamente. Quando si invoca un delegato, tutti i metodi associati vengono chiamati nell'ordine in cui sono stati aggiunti.

Esempio di dichiarazione e utilizzo:

// Dichiarazione del delegato
public delegate int MyDelegate(int x, int y);

// Metodo che corrisponde alla firma del delegato
public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

// Utilizzo del delegato
public class Program
{
    public static void Main(string[] args)
    {
        Calculator calc = new Calculator();

        // Creazione di un'istanza del delegato e collegamento con il metodo Add
        MyDelegate del = new MyDelegate(calc.Add);

        // Chiamata del metodo tramite il delegato
        int result = del(5, 3);
        System.Console.WriteLine(result); // Output: 8
    }
}

Con l'introduzione di .NET Framework 3.5 e LINQ, i delegati generici integrati sono diventati ampiamente diffusi:

  • Action<T1, ..., Tn>: Delegato che non restituisce valore (void). Può accettare da 0 a 16 parametri di diversi tipi.
  • Func<T1, ..., Tn, TResult>: Delegato che restituisce un valore di tipo TResult. Può accettare da 0 a 16 parametri di diversi tipi.
  • Predicate<T>: Delegato che accetta un parametro di tipo T e restituisce un valore booleano. Viene usato per verificare condizioni.

Tabella di confronto dei delegati integrati:

Delegato Valore di ritorno Parametri Esempio di utilizzo
Action void 0..16 parametri Eseguire un'azione senza valore di ritorno
Func<TResult> TResult 0 parametri + valore di ritorno TResult Calcolo senza dati di input
Func<T, TResult> TResult 1 parametro di tipo T + valore di ritorno TResult Trasformazione di valore
Predicate<T> bool 1 parametro di tipo T Verifica di condizione

I delegati sono ampiamente utilizzati nella gestione degli eventi, operazioni asincrone, LINQ e per l'implementazione di callback.