Не могу понять что делает этот кусок кода. Можете объяснить?
var list = new List<Action>();
for (var i = 0; i < 5; i++)
list.Add(() => Console.WriteLine(i));
foreach (var func in list)
func();
Данный код:
"Проблема замыкания" тут в том, что аргументы функции тоже сохраняются по ссылке и при вызове этих функций получается, что каждая вызывается с одним и тем же аргументом - последним значением переменной i
после окончания цикла. Как-то так.
Действительно, захват внешних (для лямбда выражения) переменных осуществляется «по ссылке», это означает, что переменная i исчезает из стека и становится полем специально сгенерированного класса, в который затем помещается и тело анонимного метода.
Интересно отметить, что начиная с С# 5 вот такое выражение (ваш код c использованием foreach
):
var list = new List<Action>();
foreach (var i in Enumerable.Range(1, 5))
list.Add(() => Console.WriteLine(i));
foreach (var func in list)
func();
Выдаст предсказуемый результат
1
2
3
Начиная с пятой версии языка переменная в цикле foreach
создаётся заново при каждой итерации. Следовательно для того, чтобы получить результат 1 2 3
в предыдущих языках с foreach
или в любой версии с for
нужно просто создать переменную внутри цикла:
var list = new List<Action>();
for (var i = 0; i < 5; i++)
{
var temp = i;
list.Add(() => Console.WriteLine(temp));
}
foreach (var func in list)
func();
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не получается скрыть картинку в fancybox, документации не нашел, documentgetElementById(wheel)
Помогите с кейсом,нужно сделать post запрос получить данные пользователя fio,inn,password и записать их в стейт потом отобразить в input и что бы администратор...
Делаю скрипт на jquery, который должен добавлять к определенному символу/словосочетанию/цифрам также определенные символы/словосочетания/цифрыНапример...