devterview_$ iniciar simulação

LINQ é preguiçoso: avaliação diferida

MédioPlenoLINQ

Pergunta

O que significa dizer que uma query LINQ (`IEnumerable`) é avaliada de forma diferida, e que bugs isso causa?

Resposta esperada

Operadores como `Where`, `Select`, `Take` não executam na hora — eles montam uma descrição da query. A execução só acontece quando você itera o resultado: `foreach`, `ToList()`, `Count()`, `First()`. Consequências: (1) iterar a mesma query duas vezes reexecuta tudo (e pode bater no banco/IO de novo) — materialize com `ToList()` se for reutilizar. (2) Se a fonte muda entre a definição e a iteração, o resultado reflete o estado no momento da iteração, não da definição (captura de variável em closure é o caso clássico). (3) Uma exceção da query estoura no ponto de iteração, longe de onde a query foi escrita, o que confunde o debugging. Diferida é ótima pra compor e pra não trazer dados que você não vai usar, mas exige saber quando ela 'dispara'.

Por que perguntam isso

Pergunta pleno. Bom candidato cita 'reexecuta ao iterar de novo' e 'materialize com ToList pra reusar', além do clássico da closure.

#linq#deferred-execution#ienumerable
publicidade

Relacionadas