Дано:
void AFunction()
{
foreach(AClass i in AClassCollection)
{
listOfLambdaFunctions.AddLast( () => { PrintLine(i.name); } );
}
}
void Main()
{
AFunction();
foreach( var i in listOfLambdaFunctions)
i();
}
теперь вы могли бы подумать, что это сделало бы equivilant:
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 (любой С#, который есть)
что происходит? делает ли лямбда-функцию каким-то образом "ссылкой" на переменную или что-то еще? все равно вокруг этой проблемы?