Expressões lambda
ResumoUma lambda (
x => x * 2) é um método anônimo conciso. É a forma que você usa para criarFunc/Actioninline — em LINQ, callbacks e configuração. Lambdas capturam variáveis do escopo (closures).
1. Objetivos de Aprendizagem#
- Escrever lambdas de expressão e de bloco.
- Entender captura de variáveis (closures).
- Reconhecer lambdas no LINQ e em APIs de configuração.
2. Pré-requisitos#
- Func, Action e Predicate (tópico 9.1).
3. Conceito#
Uma lambda é um método sem nome escrito inline:
- De expressão:
x => x * 2(retorna a expressão). - De bloco:
x => { ...; return ...; }(várias instruções).
Closure: a lambda pode capturar variáveis do escopo onde foi criada e usá-las depois. O porquê: escrever comportamento pequeno e contextual sem declarar um método separado.
4. Mão na Massa#
4.1. Setup#
dotnet new console -n Catalog.Lambdas
cd Catalog.Lambdas
4.2. Implementação Passo a Passo#
- Lambda de expressão e de bloco:
Func<int, int> dobro = x => x * 2;
Func<int, string> descrever = x =>
{
var paridade = x % 2 == 0 ? "par" : "ímpar";
return $"{x} é {paridade}";
};
Console.WriteLine(dobro(5)); // 10
Console.WriteLine(descrever(3)); // 3 é ímpar
- Closure (captura de variável):
decimal aliquota = 0.1m;
Func<decimal, decimal> comImposto = preco => preco * (1 + aliquota);
Console.WriteLine(comImposto(100m)); // 110 — capturou 'aliquota'
- Em LINQ:
var numeros = new[] { 1, 2, 3, 4 };
var pares = numeros.Where(n => n % 2 == 0).Select(n => n * 10);
Console.WriteLine(string.Join(",", pares)); // 20,40
4.3. Executando#
dotnet run
5. Exemplo Completo#
numeros.Where(n => n % 2 == 0).Select(n => n * 10) usa duas lambdas para filtrar e transformar — exatamente o padrão que você usará para manipular dados de uma API.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
| Manter lambdas curtas e legíveis | Lambdas de bloco enormes — extraia para um método nomeado |
| Entender o que a closure captura | Capturar variáveis de laço sem atenção (efeitos surpreendentes) |
Atençãouma closure captura a variável, não o valor no instante. Capturar a variável de controle de um
forpode levar todas as lambdas a enxergarem o valor final — use uma cópia local dentro do laço quando necessário.
7. Segurança e Produção#
- Lambdas que capturam muitos objetos podem prolongar o tempo de vida deles na memória. Em código de alta performance, prefira métodos estáticos quando não há captura.
8. Exercícios#
- Fácil: escreva uma lambda que retorna o quadrado de um número.
- Médio: crie uma closure que soma um "acréscimo" configurável a qualquer valor.
- Desafio: demonstre a armadilha de captura de variável de laço e conserte-a.
9. Resumo#
Lambdas são métodos anônimos concisos usados para criar Func/Action inline. Capturam variáveis do escopo (closures). Mantenha-as curtas e atente para o que a closure captura.
10. Próximos Passos#
A seguir, o mecanismo de notificação baseado em delegates: eventos.
11. Referências#
- Microsoft Learn — Expressões lambda
- Microsoft Learn — Métodos anônimos
- Microsoft Learn — Closures em C#