Opa! Como vocês estão meus caros? Meu nome é André Castro e sou o mais novo camarada do 100loop! Eu sou MCP e trabalho como Analista de Sistemas na Webaula. Bom, hoje eu vou falar sobre algo relativamente fácil, os meus amigos Métodos Anônimos. Métodos anônimos começaram no C# 2.0 e a idéia é bem interessante e simples, veja bem: Temos um botão, o btnTeste, e precisamos adicionar uma funcionalidade no evento Click dele dinamicamicamente, para isso normalmente criamos um método com a funcionalidade que queremos, e depois atribuimos ao objeto com um EventHandler associado ao método:

protected void btnTeste_Click(object sender, EventArgs e)
{
    if (divHide.Visible)
    {
        divHide.Visible = false;
    }
    else
    {
        divHide.Visible = true;
    }

}

btnTeste.Click += new EventHandler(btnTeste_Click);

Ate aí tudo bem, mas veja bem, esse método só vai ser usado uma vez, precisavamos mesmo ter criado mais um método no código? Na verdade não, podemos usar um método anônimo para facilitar as coisas, visualize:

btnTeste.Click += delegate(Object o, EventArgs a)
                    {
                        if (divHide.Visible)
                        {
                            divHide.Visible = false;
                        }
                        else
                        {
                            divHide.Visible = true;
                            }
                    };

Agora conseguimos criar e adicionar o delegate ao mesmo tempo, olha como ficou mais facil. Percebe –se tambêm que o delegate não tem identificação, por isso é chamado de método anônimo. Deixe eu dar mais um exemplo, dessa vez criamos uma variavel que herda da Interface IEnumerable ( Mesma da Collection ) e vamos popular-la com uma sequencia de 1 a 10. E usar um método anônimo para pegar apenas os números pares:

// O método Range da classe Enumerable cria uma sequencia de numero, nesse caso
// estamos criando uma sequencia  que começa do número 1 ao 10
IEnumerable sequenciaNum = Enumerable.Range(1, 10);

// Agora usamos o metodo Where da Interface IEnumerable para selecionarmos
// apenas os numeros pares
sequenciaNum = sequenciaNum.Where(delegate(int numero)
{
    // o caracter % é o MOD do c# (Ele pega o RESTO de uma divisão pelo numero informado,
    // nesse caso, o 2)
    if (numero % 2 == 0) return true;
    return false;

});

// Imprime o resultado
foreach (int num in sequenciaNum)
{
    Console.WriteLine(num);
}

Obs: O método IEnumerable.Where recebe como parametro uma Func, isso significa que é uma função que precisa receber um parametro do mesmo tipo da nossa variavel, ou seja: Inteiro e retornar um valor booleano. Bom, ja entendemos um pouco dos tais métodos Anônimos apresentados no C# 2.0, mas acontece que no C# 3.0 nós temos a presença de mais um camarada, que de certa forma facilitam a nossa vida, são as Expressões Lambda ( Lambda Expressions ). As Expressões Lambda nos da uma sintaxe mais simples e funcional para escrevermos Métodos Anônimos, além de diminuir (bastante) nossas linhas de código, vamos usar o mesmo exemplo anterior, agora com as Expressões Lambda.

// O método Range da classe Enumerable cria uma sequencia de numero,
// nesse caso estamos criando uma sequencia que começa do número 1 ao 10
IEnumerable sequenciaNum = Enumerable.Range(1, 10);

// Agora com Expressões Lambda, olha como diminui a quantidade de código.
sequenciaNum = sequenciaNum.Where(numero => numero % 2 == 0);

// Imprime o resultado
foreach (int num in sequenciaNum)
{
    Console.WriteLine(num);
}

Simples né? Bom talvez fique simples depois de eu explicar, vamos la, a idéia basica é: PARAMETROS => EXPRESSÃO O operador => significa que é uma Expressões Lambda. Nós trocamos toda a declaração do delegate:

delegate(int numero)
            {

Apenas pelo parametro (numero) e pelo operador =>. Trocamos tambem o

      if (numero % 2 == 0) return true;
                return false;

Apenas pela condição numero % 2 == 0 . Como vocês podem ver as Expressões Lambda facilitam ainda mais o que os Métodos Anônimos ja facilitavam. Bom filhotes, é isso. Qualquer dúvida estou a disposição, abraços!