Дано:
void AFunction()
{
foreach(AClass i in AClassCollection)
{
listOfLambdaFunctions.AddLast( () => { PrintLine(i.name); } );
}
}
void Main()
{
AFunction();
foreach( var i in listOfLambdaFunctions)
i();
}
Теперь вы думаете, что это будет эквивалентно:
void Main()
{
foreach(AClass i in AClassCollection)
PrintLine(i.name);
}
но это не так, он будет печатать имя последнего элемента в AClassCollection каждый раз!
так что в основном один и тот же элемент использовался в каждой лямбда-функции. я подозревал, что может быть некоторая задержка в «когда лямбда была создана» или «когда она сделала снимок внешних переменных, используемых в ней», или, в принципе, просто «ссылка на локальную переменную» i »
так я и сделал:
string astr = "a string";
AFunc fnc = () => { System.Diagnostics.Debug.WriteLine(astr); };
astr = "chagnged!";
fnc();
и сюрприз, сюрприз, он выводит «изменилось!»
Я использую XNA 3.1 (какой бы ни был # #)
что происходит?
Лямбда-функция как-то хранит «ссылку» на переменную или что-то еще?
есть ли вообще проблема вокруг этой проблемы?