I apologize for the large amount of text. Skit read:
Methodlnvoker[] delegates = new Methodlnvoker[2]; int outside =0; // #1 Создает экземпляр переменной только однажды for (int i = 0; i < 2; i++) { int inside =0; // #2 Создает экземпляр переменной многократно delegates[i] = delegate // #3 Захват переменной анонимным методом { Console.WriteLine ( " ({0 } ,{1}) " , outside, inside); outside++; inside++; }; } Methodlnvoker first = delegates[0] ; Methodlnvoker second = delegates[1]; first () ; first () ; first () ; second(); second(); Давайте подумаем, как это реализовано, по крайней мере, с компилятором С# 2 от Microsoft. Происходит вот что: один дополнительный класс создается для содержания переменной outer, а другой — для содержания переменной inner и ссылки на первый дополнительный класс. По существу, каждая область видимости, которая содержит захваченную переменную, получает собственный тип со ссылкой на следующую область видимости, которая содержит захваченную переменную. В данном случае было два экземпляра типа для содержания переменной inner, и оба они ссылаются на тот же экземпляр типа, содержащий переменную outer.
That is, if I understood correctly, in the end something like this is created:
class <>G1 { int inside; // точнее, ссылка на inside <>G2 outside; } class <>G2 { int outside }
And now the question (if I understood everything correctly) - why do this? Why can not be done simply:
class <>G { int inside; // точнее, ссылка на inside int outside; }