"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué las expresiones de lambda capturan el valor final de las variables de iteración y cómo se puede evitar esto?

¿Por qué las expresiones de lambda capturan el valor final de las variables de iteración y cómo se puede evitar esto?

Publicado el 2025-02-06
Navegar:897

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

riesgo de usar variables iterativas en expresiones lambda

Las expresiones Lambda proporcionan una forma concisa de definir funciones en línea en un bucle. Sin embargo, el uso de variables iterativas directamente en Lambdas puede conducir a un comportamiento inesperado más adelante.

Lambda Trap para iterando variables:

Considere el siguiente código:

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

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

La gente podría pensar que cada lambda imprimirá el valor correspondiente de i. Sin embargo, todos los lambdas comparten la misma referencia de captura a I debido a los cierres.

Resultado de impresión accidental:

Cuando sale el bucle, me convierte en 10, y todas las lambdas ahora apuntan a este valor final. Como resultado, la ejecución del Lambda imprimirá "10" diez veces en lugar de la secuencia esperada de 0 a 9.

Este comportamiento proviene del cierre de Lambda mantiene referencias a variables declaradas dentro de su alcance, incluso si se ha completado el bucle.

Evitación y métodos alternativos:

]]

Para resolver este problema, crear una variable local en el bucle y asignarla al valor de la variable iterativa:

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

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

Esto asegura que cada Lambda capture un valor diferente de J, lo que resulta en la secuencia de impresión esperada.

Recuerde que usar variables iterativas directamente en las expresiones lambda puede conducir a situaciones inesperadas relacionadas con los cierres. En su lugar, considere crear variables locales para capturar con precisión los valores requeridos.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3