Pular para o conteúdo
.NETExpressões lambda
Módulo 01Fundamentos da Plataforma e da Linguagem

Expressões lambda

intermediario 24 min de leitura·Atualizado · .NET 9
Resumo

Uma lambda (x => x * 2) é um método anônimo conciso. É a forma que você usa para criar Func/Action inline — 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#

Shell
dotnet new console -n Catalog.Lambdas
cd Catalog.Lambdas

4.2. Implementação Passo a Passo#

  1. Lambda de expressão e de bloco:
C#
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
  1. Closure (captura de variável):
C#
decimal aliquota = 0.1m;
Func<decimal, decimal> comImposto = preco => preco * (1 + aliquota);
Console.WriteLine(comImposto(100m)); // 110 — capturou 'aliquota'
  1. Em LINQ:
C#
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#

Shell
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çaEvite
Manter lambdas curtas e legíveisLambdas de bloco enormes — extraia para um método nomeado
Entender o que a closure capturaCapturar variáveis de laço sem atenção (efeitos surpreendentes)
Atenção

uma closure captura a variável, não o valor no instante. Capturar a variável de controle de um for pode 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#

09-02 — Expressões lambda | Curso ASP.NET Core