"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que as expressões lambda capturam o valor final das variáveis ​​de iteração e como isso pode ser evitado?

Por que as expressões lambda capturam o valor final das variáveis ​​de iteração e como isso pode ser evitado?

Postado em 2025-02-06
Navegar:582

Why Do Lambda Expressions Capture the Final Value of Iteration Variables, and How Can This Be Avoided?

risco de usar variáveis ​​iterativas nas expressões lambda

expressões Lambda fornecem uma maneira concisa de definir funções embutidas em um loop. No entanto, o uso de variáveis ​​iterativas diretamente em Lambdas pode levar a um comportamento inesperado posteriormente.

TRAP LAMBDA para variáveis ​​de iteração:

considere o seguinte código:

for (int i = 0; i  Console.WriteLine(i);
    actions.Add(action);
}

foreach (var action in actions) {
    action();
}

as pessoas podem pensar que cada lambda imprimirá o valor correspondente de i. No entanto, todos os lambdas compartilham a mesma referência de captura a I devido a fechamentos.

Resultado acidental de impressão:

Quando o loop sair, eu me torna 10 e todos os lambdas agora apontam para esse valor final. Como resultado, a execução do Lambda imprimirá "10" dez vezes, em vez da sequência esperada de 0 a 9.

Este comportamento decorre do fechamento do Lambda mantém referências a variáveis ​​declaradas em seu escopo, mesmo que o loop tenha sido concluído.

evitação e métodos alternativos:

]

Para resolver esse problema, crie uma variável local no loop e atribua -a ao valor da variável iterativa:

for (int i = 0; i  Console.WriteLine(j);
    actions.Add(action);
}

foreach (var action in actions) {
    action();
}

garante que cada lambda capture um valor diferente de j, resultando na sequência de impressão esperada.

Lembre -se de que o uso de variáveis ​​iterativas diretamente nas expressões Lambda pode levar a situações inesperadas relacionadas a fechamentos. Em vez disso, considere criar variáveis ​​locais para capturar com precisão os valores necessários.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3