C# 3.0 lambda expressions

A melhor maneira que eu tenho pra descrever lambda expressions é – C# Anonymous Methods mais facilitado.

Mas o que é anonymous method no c# 2.0?

Como você deve saber no c#1.x/2.x era possível escrever códigos da seguinte forma:

class AlgumaClasse

{

delegate void AlgumDelegate();

public void InvokeMethod()

{

AlgumDelegate del = new AlgumDelegate(AlgumMetodo);

del();

}

void AlgumMetodo()

{

Console.WriteLine(“Olá mundo”);

}

}

Depois veio anonymous methods que permitem a você escrever o código acima de uma maneira mais simplificada:

class AlgumaClasse

{

delegate void AlgumDelegate();

public void InvokeMethod()

{

AlgumDelegate del = delegate()

{

Console.WriteLine(“Hello”);

};

del();

}

}

O que você vê depois do “Delegate()”, é um método anônimo.Mesmo sendo melhor que a versão do c#1x. ainda assim requer algum código:

Lambda expressions dão a você uma sintaxe mais concisa e funcional,usando a sintaxe “=>”.

O código acima usando lambda expresssions poderia ser escrito da seguinte forma:

class AlgumaClasse

{

delegate void AlgumDelegate();

public void InvokeMethod()

{

AlgumDelegate del = () => Console.WriteLine(“Hello”) ;

del();

}

}

Geralmente a sintaxe é:

Parâmetros => expressão

Agora óbvio,lambda expressions não são apenas uma maneira mais simples de se escrever métodos anônimos.Eles realmente superam em funcionalidade os métodos anônimos.Porque?:

  • Lambda expressions entendem o tipo de parâmetro que você quer passar mesmo que você os omita.Anonymous methods não permitem.
  • Lambda Expressions podem usar bloco de comandos e expressões.Anonymous methods só aceitam blocos de comandos.
  • Lambda Expressions podem ser passadas como argumentos.

Vamos falar de cada um deles:

Lambda expressions entendem o tipo de parâmetro que você quer passar mesmo que você os omita.Anonymous methods não permitem.

Palavras difíceis para algo simples:

(int x) => x + 1 ; // é o mesmo que
x => x + 1 ;

Na segunda linha o tipo está sendo omitido.

Lambda Expressions podem usar bloco de comandos e expressões.Anonymous methods só aceitam blocos de comandos.

Outra vez palavras difíceis para algo simples:

(int x) => x + 1 ; // é o mesmo que
(int x) => { return x + 1; }

Na segunda linha nós temos um bloco de comando,e na primeira nós temos uma expressão.Então a primeira é igual a segunda mas é mais fácil de entender e escrever.

Lambda Expressions podem ser passadas como argumentos.

Você pode passar lambdas expressions como argumentos para métodos genéricos.Vamos considerar o seguinte exemplo.Vamos dizer que você tivesse,um extension method,como mostrado a seguir:

public static class myExtensions
{
public static void SpankIt<T,U>(
this IEnumerable<T> source,
Func<T, U> someParameter)
{
foreach (T element in source)
Console.WriteLine(“SPANK ” + someParameter(element) + “!!”);
}
}

Você poderia usar o extension method acima,assim:

static void Main(string[] args)
{
List<String> whoToSpank = new List<String>() ;
whoToSpank.Add(“Monkey”) ;
whoToSpank.Add(“Bannana”) ;

whoToSpank.SpankIt(c => “Monkey”) ;
}

E “SPANK MONKEY !!” seria escrito duas vezes.

Mas espere um pouco.O significa o “U” no extension method?Se você colocar um breakpoint no seu extension method você vai perceber que o c# 3.0 é esperto o bastante pra saber que “U” é uma string.Você nunca citou que “U” seria uma string,ele se baseia na lambda expression que você passou.

Você não pode fazer isso com métodos anônimos.

É isso!Abraço.