Condividi tramite


Delegati con metodi denominati e anonimi (Guida per programmatori C#)

Aggiornamento: novembre 2007

È possibile associare un delegato a un metodo denominato. Quando si crea un'istanza di un delegato utilizzando un metodo denominato, il metodo viene passato come parametro, come nell'esempio seguente:

// Declare a delegate:
delegate void Del(int x);

// Define a named method:
void DoWork(int k) { /* ... */ }

// Instantiate the delegate using the method as a parameter:
Del d = obj.DoWork;

Questa operazione corrisponde a utilizzare un metodo denominato. I delegati costruiti con un metodo denominato possono incapsulare un metodo statico o un metodo di istanza. I metodi denominati rappresentano l'unico modo per creare un'istanza di un delegato nelle versioni precedenti di C#. In una situazione in cui la creazione di un nuovo metodo rappresenta un sovraccarico inutile, C# consente di creare un'istanza di un delegato e di specificare immediatamente un blocco di codice che verrà elaborato dal delegato al momento della chiamata. Il blocco può contenere un'espressione lambda oppure un metodo anonimo. Per ulteriori informazioni, vedere la classe Funzioni anonime (Guida per programmatori C#).

Note

La firma del metodo che viene passato come parametro di delegato deve essere identica a quella della dichiarazione del delegato.

Un'istanza di delegato può incapsulare un metodo statico o un metodo di istanza.

Sebbene il delegato possa utilizzare un parametro out, è consigliabile non utilizzarlo con delegati di eventi multicast perché non è possibile sapere quale delegato verrà chiamato.

Esempio 1

Di seguito è illustrato un semplice esempio di dichiarazione e utilizzo di un delegato. Si noti che sia il delegato Del che il metodo associato MultiplyNumbers presentano la stessa firma.

// Declare a delegate
delegate void Del(int i, double j);

class MathClass
{
    static void Main()
    {
        MathClass m = new MathClass();

        // Delegate instantiation using "MultiplyNumbers"
        Del d = m.MultiplyNumbers;

        // Invoke the delegate object.
        System.Console.WriteLine("Invoking the delegate using 'MultiplyNumbers':");
        for (int i = 1; i <= 5; i++)
        {
            d(i, 2);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }

    // Declare the associated method.
    void MultiplyNumbers(int m, double n)
    {
        System.Console.Write(m * n + " ");
    }
}
/* Output:
    Invoking the delegate using 'MultiplyNumbers':
    2 4 6 8 10
*/

Esempio 2

Nell'esempio che segue un delegato viene associato a metodi static e di istanza e restituisce informazioni specifiche da ciascuno di essi.

// Declare a delegate
delegate void Del();

class SampleClass
{
    public void InstanceMethod()
    {
        System.Console.WriteLine("A message from the instance method.");
    }

    static public void StaticMethod()
    {
        System.Console.WriteLine("A message from the static method.");
    }
}

class TestSampleClass
{
    static void Main()
    {
        SampleClass sc = new SampleClass();

        // Map the delegate to the instance method:
        Del d = sc.InstanceMethod;
        d();

        // Map to the static method:
        d = SampleClass.StaticMethod;
        d();
    }
}
/* Output:
    A message from the instance method.
    A message from the static method.
*/

Vedere anche

Attività

Procedura: combinare delegati multicast (Guida per programmatori C#)

Concetti

Guida per programmatori C#

Riferimenti

Delegati (Guida per programmatori C#)

Eventi (Guida per programmatori C#)