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#)