«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему выражения Lambda отражают конечное значение переменных итерации и как этого можно избежать?

Почему выражения Lambda отражают конечное значение переменных итерации и как этого можно избежать?

Опубликовано в 2025-02-06
Просматривать:666

Why Do Lambda Expressions Capture the Final Value of Iteration Variables, and How Can This Be Avoided?

риск использования итеративных переменных в Lambda Expressions

]

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