He estado aprendiendo C#, y estoy tratando de entender lambdas. En esta muestra a continuación, imprime 10 diez veces.¿Cómo decirle a una función lambda que capture una copia en lugar de una referencia en C#?
class Program
{
delegate void Action();
static void Main(string[] args)
{
List<Action> actions = new List<Action>();
for (int i = 0; i < 10; ++i)
actions.Add(()=>Console.WriteLine(i));
foreach (Action a in actions)
a();
}
}
Obviamente, la clase generada detrás del lambda está almacenando una referencia o puntero a la variable int i
, y es asignar un nuevo valor a la misma referencia cada vez que se repite el bucle. ¿Hay una manera de forzar la lambda para tomar una copia en su lugar, al igual que la sintaxis de C++ 0x
[&](){ ... } // Capture by reference
vs
[=](){ ... } // Capture copies
Usted puede quiero leer [este artículo] (http://csharpindepth.com/Articles/Chapter5/Closures.aspx), escrito por nuestro propio Jon Skeet. –
posible duplicado de [C# Variable capturada en bucle] (http://stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop) – nawfal
Me resulta curioso que la mayoría de las respuestas a esta pregunta son explicando la semántica de captura que es perfectamente clara para el autor de la pregunta, mientras que solo algunos mencionan la solución (copia temporal). ¿Alguien leyó preguntas antes de responder? – ghord