Métodos anônimos (Guia de programação do C#)

Nas versões do translation from VPE for Csharp antes 2.0, a única maneira de declarar um delegado foi usar métodos nomeados.Translation from VPE for Csharp 2.0 introduziu a métodos anônimo e em translation from VPE for Csharp 3.0 e posterior, sistema autônomo expressões lambda substituem métodos anônimo sistema autônomo a maneira preferencial para gravar o código embutido.No entanto, as informações sobre métodos anônimo neste tópico também se aplica a expressões lambda.Há um caso no qual um método anônimo fornece funcionalidade não encontrada em expressões lambda.Métodos anônimos permitem omitir a lista de parâmetros, e isso significa que um método anônimo pode ser convertido em delegados com uma variedade de assinaturas.Isso não é possível com as expressões lambda.Para obter mais informações especificamente sobre as expressões lambda, consulte Expressões lambda (guia de programação translation from VPE for Csharp).

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 instance
delegate void Del(int x);

// Instantiate the delegate using an anonymous method
Del d = delegate(int k) { /* ... */ };

Usando métodos anônimo, você reduzir a sobrecarga codificando em instanciando delegados porque não é necessário que 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 mercadoria exemplo seria quando você inicia um novo segmento.Essa classe cria um segmento e também contém o 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 anônimo método.

É um erro para que uma demonstrativo de salto, sistema autônomo GoTo, quebra, or continuar, dentro do método anônimo bloqueio se o destino está fora do bloco.Também é um erro para que uma demonstrativo de salto, sistema autônomo goto, break, ou continue, fora do bloco de métodos anônimo se o destino estiver dentro do bloco.

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

Ao contrário das variáveis locais, o tempo de vida da variável capturado estende até os representantes que fazem referência os métodos anônimo são qualificados para coleta de lixo.Uma referência a n é capturado no momento em que o representante é criado.

Não é um método anônimo acesso o ref or check-out parâmetros de um escopo externo.

Nenhum código não seguro pode ser acessado dentro de bloco anônimo método.

Métodos anônimo 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

Conceitos

Guia de Programação C#

Referência

Representantes (guia de programação C#)

Expressões lambda (guia de programação translation from VPE for Csharp)

Não seguro código e ponteiros (guia de programação C#)

Métodos (Guia de programação do C#)

Delegados com nomeados versus métodos anônimo (guia de programação translation from VPE for Csharp)

Outros recursos

Referência C#