dado:C# lambda, valor de variable local no tomado cuando piensas?
void AFunction()
{
foreach(AClass i in AClassCollection)
{
listOfLambdaFunctions.AddLast(() => { PrintLine(i.name); } );
}
}
void Main()
{
AFunction();
foreach(var i in listOfLambdaFunctions)
i();
}
ahora se podría pensar que harían lo equivilant a:
void Main()
{
foreach(AClass i in AClassCollection)
PrintLine(i.name);
}
pero no es así, lo que va a hacer es imprimir el nombre del último elemento de cada AClassCollection ¡hora! por lo que, básicamente, el mismo elemento se estaba utilizando en cada función lambda. sospechaba que podría haber algún retraso en "cuando se creó el lambda" o "cuando tomó una instantánea de las variables externas utilizadas en él", o básicamente, simplemente sosteniendo una 'referencia a la variable local' i '
así que hice esto:
string astr = "a string";
AFunc fnc =() => { System.Diagnostics.Debug.WriteLine(astr); };
astr = "chagnged!";
fnc();
y sorpresa, sorpresa, produce "¡cambiado!"
estoy usando XNA 3.1 (C# lo que es)
lo que está pasando? ¿la función lambda almacena de alguna manera una "referencia" a la variable o algo así? hay de todos modos alrededor de este problema?
relacionadas: ¿Cómo http://stackoverflow.com/questions/271440/c-captured-variable-in-loop – Ani
puede salir "cambiado"! cuando asignó "chapped!"? : p –
"La regla de cierre sobre variables, no sobre valores" se aplica aquí, así que no espere que el valor de astr se copie en esa función lambda, copió la variable, en este caso es una referencia a esa variable, y ya lo has probado con tus propias observaciones. – Onur