Anonymous Methods (C# Programming Guide)
Nas versões de C# antes de 2.0, a única maneira de declarar uma delegar foi usar métodos de chamada. C# 2.0 introduziu a métodos anônimos e no C# 3.0 e posterior, as expressões lambda substituem os métodos anônimos como a melhor maneira de escrever o código embutido. No entanto, as informações sobre os métodos anônimos neste tópico também se aplica a expressões lambda. Há um caso em que um método anônimo fornece a funcionalidade não encontrada nas expressões lambda. Métodos anônimos permitem omitir a lista de parâmetro. Isso significa que um método anônimo pode ser convertido para representantes com uma variedade de assinaturas. Isso não é possível com as expressões lambda. Para obter mais informações especificamente sobre expressões lambda, consulte Expressões lambda (guia de programação de C#).
Criando métodos anônimos é essencialmente uma maneira de passar um bloco de códigos como um parâmetro Delegate. Aqui estão dois exemplos:
// Create a handler for a click event.
button1.Click += delegate(System.Object o, System.EventArgs e)
{ System.Windows.Forms.MessageBox.Show("Click!"); };
// Create a delegate.
delegate void Del(int x);
// Instantiate the delegate using an anonymous method.
Del d = delegate(int k) { /* ... */ };
Usando os métodos anônimos, reduzir a sobrecarga codificação instanciar delegados, porque você não precisa criar um método separado.
Por exemplo, a especificação de que um bloco de código em vez de um delegado pode ser útil em uma situação quando precisar criar um método pode parecer uma sobrecarga desnecessária. Um bom exemplo seria quando você inicia um novo segmento. Essa classe cria um segmento e também contém o código que o segmento executa sem criar um método adicional para o delegado.
void StartThread()
{
System.Threading.Thread t1 = new System.Threading.Thread
(delegate()
{
System.Console.Write("Hello, ");
System.Console.WriteLine("World!");
});
t1.Start();
}
Comentários
O escopo dos parâmetros de um método anônimo é o Bloco de métodos anônimo.
É um erro para ter uma declaração de salto, como goto, quebra, ou continuar, dentro do bloco do método anônimo, se o destino estiver fora do bloco. Também é um erro para ter uma declaração de salto, como goto, break, ou continue, fora do bloco de método anônimo, se o destino estiver dentro do bloco.
Os parâmetros cujo escopo contém uma declaração de método anônimo e variáveis locais são chamados de externo variáveis do método anônimo. Por exemplo, no segmento de código a seguir, n é uma variável externa:
int n = 0;
Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };
Ao contrário das variáveis locais, o tempo de vida da variável capturado estende até que os representantes que fazem referência os métodos anônimos são qualificados para coleta de lixo. Uma referência a n é capturado no momento em que o representante é criado.
Um método anônimo não pode acessar o ref ou check-out parâmetros de um escopo externo.
Nenhum código não seguro pode ser acessado dentro do Bloco de métodos anônimo.
Métodos anônimos não são permitidos no lado esquerdo do é operador.
Exemplo
O exemplo a seguir demonstra duas maneiras de instanciar um delegado:
Associando o representante com um método anônimo.
Associar o representante a um método nomeado (DoWork).
Em cada caso, uma mensagem é exibida quando o representante é invocado.
// Declare a delegate.
delegate void Printer(string s);
class TestClass
{
static void Main()
{
// Instatiate the delegate type using an anonymous method.
Printer p = delegate(string j)
{
System.Console.WriteLine(j);
};
// Results from the anonymous delegate call.
p("The delegate using the anonymous method is called.");
// The delegate instantiation using a named method "DoWork".
p = new Printer(TestClass.DoWork);
// Results from the old style delegate call.
p("The delegate using the named method is called.");
}
// The method associated with the named delegate.
static void DoWork(string k)
{
System.Console.WriteLine(k);
}
}
/* Output:
The delegate using the anonymous method is called.
The delegate using the named method is called.
*/
Consulte também
Referência
Delegates (C# Programming Guide)
Expressões lambda (guia de programação de C#)
Unsafe Code and Pointers (C# Programming Guide)
Methods (C# Programming Guide)
Representantes com nome vs. Anonymous Methods (C# Programming Guide)