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.
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