Lambda Expressions обеспечивает краткий способ определения встроенных функций в цикле. Однако использование итеративных переменных непосредственно в Lambdas может привести к неожиданному поведению позже.
]Lambda Trap для итерационных переменных:
рассмотрим следующий код:
for (int i = 0; i Console.WriteLine(i);
actions.Add(action);
}
foreach (var action in actions) {
action();
}
люди могут подумать, что каждый лямбда печатает соответствующее значение i. Тем не менее, все Lambdas имеют одну и ту же ссылку на I. из -за закрытия. ]
результат случайной печати: ]
, когда петля выходит, мне становится 10, и все Lambdas теперь указывают на это окончательное значение. В результате выполнение Lambda будет печатать «10» десять раз вместо ожидаемой последовательности от 0 до 9.]
это поведение связано с закрытием Lambda, поддерживает ссылки на переменные, объявленные в его объеме, даже если цикл был завершен.]
избегание и альтернативные методы: ]
Чтобы решить эту проблему, создайте локальную переменную в цикле и назначьте ее значению итеративной переменной:]
for (int i = 0; i Console.WriteLine(j);
actions.Add(action);
}
foreach (var action in actions) {
action();
}
это гарантирует, что каждая лямбда захватывает различное значение j, что приводит к ожидаемой последовательности печати. ]
помните, что использование итеративных переменных непосредственно в выражениях Lambda может привести к неожиданным ситуациям, связанным с закрытием. Вместо этого рассмотрите возможность создания локальных переменных для точного захвата требуемых значений.]
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3