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

Nas versões do C# antes de 2.0, a única maneira de declarar um delegar foi usar chamado métodos. C# 2.0 introduziu métodos anônimos e no C# 3.0 e posterior, as expressões lambda substituem métodos anônimos como a melhor maneira de escrever 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 funcionalidade não encontrada em 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. 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 em C#).

Criar métodos anônimos é essencialmente uma forma de passar um bloco de código como um parâmetro delegado. 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 delegates porque você não precisará criar um método separado.

Por exemplo, especificar 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ê iniciar um novo thread. Essa classe cria um segmento e também contém código que executa o thread 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étodo anônimo.

É um erro ter uma instrução de salto, como goto, quebra, ou continuar, dentro do bloco de método anônimo se o destino estiver fora do bloco. Também é um erro ter uma instrução de salto, como goto, break, ou continue, fora do bloco de método anônimo se o destino estiver dentro do bloco.

Variáveis locais e parâmetros cujo escopo contém uma declaração de método anônimo são chamados externo variáveis de 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); };

Uma referência à variável externa n deve ser capturado quando o delegado é criado. Ao contrário das variáveis locais, a vida útil de uma variável capturada estende até os representantes que fazem referência os métodos anônimos são qualificados para coleta de lixo.

Um método anônimo não pode acessar o ref ou out parâmetros de um escopo externo.

Nenhum código não seguro pode ser acessado dentro do Bloco de método 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 delegate:

  • Associando o delegado com um método anônimo.

  • Associando o delegado um método nomeado (DoWork).

Em cada caso, uma mensagem é exibida quando o delegado é chamado.

// Declare a delegate. 
delegate void Printer(string s);

class TestClass
{
    static void Main()
    {
        // Instantiate 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

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

Expressões lambda (Guia de Programação em C#)

Código não seguro e ponteiros (Guia de Programação em C#)

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

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

Conceitos

Guia de Programação em C#

Outros recursos

Referência de C#