Я не собираюсь задавать вопрос, что такое закрытие. Это закрытие:
например:
List<Func<int>> add = new List<Func<int>>();
List<int> coll = new List<int>(){1,2,3,4,5};
foreach (int i in coll)
{
add.Add(() => i*2);
}
Поскольку замыкания закрываются по переменным, без сомнения, результат будет равен 10 для всех случаев, если мы попытаемся вызвать всю функцию из списка «добавить». Это заставило меня задуматься: если это закрытие, то следующий пример также должен быть закрытием.
//Indirect way of writing the same example
Enumerable.Range(1, 5).ToList().ForEach(x => add.Add(() => x * 2));
Здесь мы также закрываем переменную, поэтому состояние переменной должно быть последним значением переменной, но, как оказалось, это не так. Это не закрытие. Создает ли лямбда свою переменную неизменным образом, т. Е. Как только мы меняем значение x, создается новая переменная для хранения значения?