Share via


Delegados com métodos nomeados versus anônimos (Guia de Programação em C#)

A delegar pode ser associado um método nomeado. Quando você instancia um delegado usando um método nomeado, o método é passado como um parâmetro, por exemplo:

// 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;

Ele é chamado usando um método nomeado. Os delegados construídos com um método nomeado podem encapsular um um estático método ou um método de instância. Métodos nomeados são a única maneira de instanciar um delegado em versões anteriores do C#. No entanto, em uma situação onde a criação de um novo método é indesejado sobrecarga, C# permite instanciar um delegado e imediatamente, especificar um bloco de código que processará o delegado quando for chamado. O bloco pode conter uma expressão lambda ou um método anônimo. Para obter mais informações, consulte Funções anônimas (Guia de Programação em C#).

Comentários

O método que você passa como um parâmetro de delegate deve ter a mesma assinatura da declaração do Delegate.

Uma instância de Delegate pode encapsular o  método Estático ou Instânciado.

Embora o delegado pode usar um check-out parâmetro, não recomendamos seu uso com representantes de evento de difusão seletiva porque você não sabe qual representante será chamado.

Exemplo 1

O seguinte é um exemplo simples de como declarar e usar um delegate. Observe que ambos delegates, Del, e o método associado, MultiplyNumbers,  possuem a mesma assinatura

// 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
*/

Exemplo 2

No exemplo a seguir, um delegate é mapeado para ambos os métodos, estático e instaciado, e retorna informações específicas de cada um.

// 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.
*/

Consulte também

Tarefas

Como combinar delegados (delegados multicast) (Guia de Programação em C#)

Referência

Delegados (Guia de Programação em C#)

Métodos anônimos (Guia de Programação em C#)

Eventos (Guia de Programação em C#)

Conceitos

Guia de Programação em C#