Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Где найти старый компилятор для C# 4.0

15.03.19 21:51
Re: Где найти старый компилятор для C# 4.0
 
MrSanders старожил
в ответ dymanoid 15.03.19 21:24
Я хочу сказать, что в C# замыкание делается на переменную, а не на значение этой переменной в момент создания замыкания.
Так понятнее?

вроде бы стало понятнее, т.е. "замыкание со ссылками", т.е.

int i = 1;
actions.Add(() => Console.WriteLine(i));
i = 2;
// печатаем

выдаст нам не 1 а 2 (хотя не ссответствует коду Closure из статьи на хабре).

Но тут вы меня опять смутили:

Для ссылочных типов там, понятно, ссылка хранится. Для значимых типов - значение.

Это как? Ссылка, хранимая в переменной "x" ссылочного типа и есть её значение. "замыкание со ссылками" будет хранить ссылку на переменную "x" а не ссылку, хранившуюся в "x" в момент создания closure. Получается в моём примере выше, шарп должен выдать 1, ведь при создании closure он соханил в нём для значимого типа его значение "1"?

Вот этот пример как раз отлично это иллюстрирует:

Не совсем отлично. Тут или шарп создал одно-единственное closure для обеих лямбд (вторая экшен это та же первая), и при инициализации для 2-го action переписал значение i (замыкание со значениями), или он создал два closure но со ссылками на i (замыкание со ссылками).

 

Перейти на