Come lavorare con i delegati in C #

Un delegato è un puntatore a funzione indipendente dai tipi che può fare riferimento a un metodo che ha la stessa firma di quello del delegato. È possibile sfruttare i delegati in C # per implementare eventi e metodi di richiamata. Un delegato multicast è uno che può puntare a uno o più metodi con firme identiche.

Comprensione dei delegati in C #

In sostanza, un delegato conserva un riferimento a un metodo e anche all'oggetto di destinazione su cui deve essere chiamato il metodo. I delegati in C # sono simili ai puntatori a funzione in C ++, ma i delegati C # sono indipendenti dai tipi. È possibile passare metodi come parametri a un delegato per consentire al delegato di puntare al metodo. I delegati vengono utilizzati per definire metodi di callback e implementare la gestione degli eventi e vengono dichiarati utilizzando la parola chiave "delegate". È possibile dichiarare un delegato che può apparire da solo o addirittura annidato all'interno di una classe.

Esistono tre passaggi nell'utilizzo dei delegati. Questi includono dichiarazione, istanziazione e invocazione. 

La firma di un delegato è simile a questa:

identificatore del tipo di risultato delegato ([parametri])

La seguente istruzione mostra come dichiarare un delegato.

public delegate void MyDelegate (string text);

Come puoi vedere nella dichiarazione precedente, il nome del delegato è "MyDelegate", ha un tipo di ritorno "void" e accetta un oggetto stringa come argomento. Ciò implica che il delegato MyDelegate può puntare a un metodo con una firma identica. Tuttavia, questa è solo una dichiarazione: è necessario creare un'istanza di un delegato prima di poterlo utilizzare. L'istruzione fornita di seguito mostra come creare un'istanza del delegato dichiarato sopra.

MyDelegate d = nuovo MyDelegate (ShowText);

Dopo aver dichiarato e istanziato il delegato, è possibile richiamare facilmente il metodo a cui punta il delegato.

d ("Hello World ...");

Qui, d è l'istanza del delegato

È anche possibile richiamare il metodo a cui punta l'istanza del delegato utilizzando il metodo Invoke () sull'istanza del delegato come mostrato di seguito.

d.Invoke ("Hello World ...");

Se si dispone di un metodo che accetta due numeri e si desidera aggiungerli e restituire la somma dei due numeri, è possibile utilizzare un delegato per memorizzare il valore restituito del metodo come mostrato nello snippet di codice riportato di seguito.

risultato int = d (12, 15);

Ecco l'elenco completo del codice per riferimento.

using System;

Delegati dello spazio dei nomi

{

    public delegate int MyDelegate (int x, int y);

    programma di classe

    {

      statico int Sum (int x, int y)

        {

            ritorno x + y;

        }

        static void Main ()

        {

            MyDelegate d = nuovo MyDelegate (Sum);           

            int risultato = d. Invoca (12, 15);

            Console.WriteLine (risultato);

            Console.ReadLine ();

        }

    }

Delegati in azione in C #

Ecco l'elenco completo del codice.

using System;

Delegati dello spazio dei nomi

{

    public delegate void MyDelegate (string text);

    programma di classe

    {

        public static void ShowText (string text)

        {

            Console.WriteLine (testo);

        }

        static void Main ()

        {

            MyDelegate d = nuovo MyDelegate (ShowText);

            d ("Hello World ...");

            Console.ReadLine ();

        }

    }

}

Si noti che è possibile assegnare più oggetti a un'istanza del delegato utilizzando l'operatore +, che rende il delegato un delegato multicasting. È inoltre possibile combinare istanze di delegato utilizzando il metodo statico Combine.

Il runtime mantiene un elenco (chiamato anche elenco di chiamate) internamente per eseguire più metodi. Il listato di codice seguente mostra come utilizzare il metodo Combine () per combinare più istanze di delegato.

myDelegate d1 = new myDelegate (Method1);

myDelegate d2 = new myDelegate (Method2);

myDelegate multicastDelegate = (myDelegate) Delegate.Combine (d1, d2);

multicastDelegate.Invoke ();

Un delegato che può puntare a più metodi è noto come delegato multicast. Notare che le istanze del delegato non sono modificabili. Pertanto, quando si combinano i delegati o si sottrae un'istanza del delegato dall'elenco, viene creata una nuova istanza del delegato per rappresentare l'elenco aggiornato o nuovo delle destinazioni o dei metodi da richiamare.

Delegati multicast in azione in C #

Il listato di codice seguente illustra un delegato multicast. Notare l'utilizzo dell'istanza del delegato: qui abbiamo usato l'operatore + = per assegnare il delegato a più metodi con firme identiche.

using System;

Delegati dello spazio dei nomi

{

    public delegate void MyDelegate ();

    programma di classe

    {

        public static void Method1 ()

        {

            Console.WriteLine ("Inside Method1 ...");

        }

        public static void Method2 ()

        {

            Console.WriteLine ("Inside Method2 ...");

        }

        static void Main ()

        {

            MyDelegate d = null;

            d + = Metodo1;

            d + = Metodo2;

            d.Invoke ();

            Console.ReadLine ();

        }

    }

}

I delegati sono ideali per implementare la programmazione guidata dagli eventi. Un delegato non ha bisogno di conoscere la classe dell'oggetto a cui fa riferimento. Tutto quello che deve sapere è la firma del metodo a cui punta. L'utilizzo corretto dei delegati può promuovere la riusabilità nel codice e la flessibilità nei progetti. È possibile fare riferimento alla documentazione in linea di Microsoft per ulteriori informazioni sui delegati.