Здравствуйте, Lloyd, Вы писали:
L>И как она здесь используется? Переделай на любой другой класс, результат будет тот же.
StringBuilder str = new StringBuilder("This is a test!");
ThreadStart ts = new ThreadStart(delegate() { Method(str); });
Thread t = new Thread(ts);
str.Length = 0; str.Append("This is a second test!");
t.Start();
t.Join();
Здравствуйте, Lloyd, Вы писали:
AVK>>А при чем тут собственно то, что в C# замыкания read-only?
L>
Хочешь поспорить о терминах? Имелось ввиду, что изменение замыканий во внешнем контексте после его образования не распространяется на внутренний, что, собственно, приведенный пример и демонстрировал.
AVK> StringBuilder str = new StringBuilder("This is a test!");
AVK> ThreadStart ts = new ThreadStart(delegate() { Method(str); });
AVK> Thread t = new Thread(ts);
AVK> str.Length = 0; str.Append("This is a second test!");
AVK> t.Start();
AVK> t.Join();
AVK>
Не, такие лоховские подтасовки не катят. Пиши тогда уж:
str = new StringBuilder("This is a second test!");
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Lloyd, Вы писали:
AVK>>>А при чем тут собственно то, что в C# замыкания read-only?
L>>
AVK>Хочешь поспорить о терминах? Имелось ввиду, что изменение замыканий во внешнем контексте после его образования не распространяется на внутренний, что, собственно, приведенный пример и демонстрировал.
А можно то же самое, но на русском языке. Что значит "изменение замыканий"? Для меня замыкание — это совокупность "захваченных" переменных. Как он может измениться?
Здравствуйте, Lloyd, Вы писали:
L>Не, такие лоховские подтасовки не катят. Пиши тогда уж:
Что то у тебя с терминологией не то. Подтасовок тут никаких нет, всего лишь демонстрация того, как нужно действовать, когда таки хочется получить требуемое. Только, конечно, лучше не StringBuilder использовать, а специальный mutable класс. А еще лучше вобще такое не использовать, ибо чревато.
Здравствуйте, Lloyd, Вы писали:
L>А можно то же самое, но на русском языке. Что значит "изменение замыканий"? Для меня замыкание — это совокупность "захваченных" переменных. Как он может измениться?
Я лучше на английском процитирую:
any changes to such variables from within the body of anonymous method are not visible after it returns. This is because anonymous methods are in fact implemented in a way very similar to anonymous inner classes in Java, and do not have direct access to variables from the enclosing scope; rather, the method makes a copy of all local variables it uses.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Lloyd, Вы писали:
L>>Не, такие лоховские подтасовки не катят. Пиши тогда уж:
AVK>Что то у тебя с терминологией не то. Подтасовок тут никаких нет, всего лишь демонстрация того, как нужно действовать, когда таки хочется получить требуемое.
Только вот требуемого поведения таким способом не получить. Смотри первоначальный пост.
Здравствуйте, AndrewVK, Вы писали:
L>>А можно то же самое, но на русском языке. Что значит "изменение замыканий"? Для меня замыкание — это совокупность "захваченных" переменных. Как он может измениться?
AVK>Я лучше на английском процитирую: AVK>
any changes to such variables from within the body of anonymous method are not visible after it returns. This is because anonymous methods are in fact implemented in a way very similar to anonymous inner classes in Java, and do not have direct access to variables from the enclosing scope; rather, the method makes a copy of all local variables it uses.
Ну, во-первых, тебе привели пример того, что изменения захваченные переменных все-таки видны после возврата из метода. А во-вторых, причем здесь джава?
Здравствуйте, Lloyd, Вы писали:
L>Ну, во-первых, тебе привели пример того, что изменения захваченные переменных все-таки видны после возврата из метода.
Мне не надо.
L> А во-вторых, причем здесь джава?
При том, что текст, оказавшийся под рукой, был заодно и про Java.
Здравствуйте, AndrewVK, Вы писали:
L>>Ну, во-первых, тебе привели пример того, что изменения захваченные переменных все-таки видны после возврата из метода.
AVK>Мне не надо.
Чего не надо? Твои слова опровергаются простейшим тестом.
L>> А во-вторых, причем здесь джава?
AVK>При том, что текст, оказавшийся под рукой, был заодно и про Java.
Но, как минимум, по отношению к .net-у он не верен.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Lloyd, Вы писали:
L>>Чего не надо? Твои слова опровергаются простейшим тестом.
AVK>Это спор о терминах.
Хорошо, напиши по-русски как ты понял приведенную цитату. Вот мой перевод:
любые именения этих переменных, сделанные внутри тела анонимного метода не видны после возврата из анонимного метода. Так происходит потому что анонимные методы в действительности реализованы способом, очень схожим с тем как реализованы inner-классы в джаве. и (анонимные методы) не имеют прямого доступа к переменным из внешней области видимости; метод создает копию всех локальных переменных, которые он ипользует.
Если я не наврал в переводе, то то что там написано не соответствует действительности.
AVK>>>При том, что текст, оказавшийся под рукой, был заодно и про Java.
L>>Но, как минимум, по отношению к .net-у он не верен.
AVK>Конкретно в цитате про C#.
Здравствуйте, Lloyd, Вы писали:
L>Да я прекрасно знаю как работают замыкания. А вот судя по твоим высказываниям, у тебя в этой области есть определенные пробелы.
Понятно, заняться не чем. В следующий раз разводить в форуме черти что не нужно, достаточно написать свое фе мне лично на сыло.
Здравствуйте, AndrewVK, Вы писали:
L>>Да я прекрасно знаю как работают замыкания. А вот судя по твоим высказываниям, у тебя в этой области есть определенные пробелы.
AVK>Понятно, заняться не чем. В следующий раз разводить в форуме черти что не нужно, достаточно написать свое фе мне лично на сыло.
До этой ветки никакого моего фе по отношению к вам не было. Так что не смог бы воспользоваться вашим советом при всем желании.
Здравствуйте, AndrewVK, Вы писали:
AVK>Понятно, заняться не чем. В следующий раз разводить в форуме черти что не нужно, достаточно написать свое фе мне лично на сыло.
Тем не менее можно все-таки объяснить на примере каким образом замыкания бывают "только для чтения"? Если мне не изменяет память переменные используемые одноврменно в контексте родительского метода и анонимного при компиляции превращаются в поля класса, соответственно, менять их пределах области видимости класса можно откуда угодно.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Тем не менее можно все-таки объяснить на примере каким образом замыкания бывают "только для чтения"? Если мне не изменяет память переменные используемые одноврменно в контексте родительского метода и анонимного при компиляции превращаются в поля класса, соответственно, менять их пределах области видимости класса можно откуда угодно.
Да лажанулся чувак. Толко признаваться в этом очень не хочется, модератор все-таки.
Здравствуйте, ie, Вы писали:
ie>Здравствуйте, AndrewVK, Вы писали:
ie>>>А причем тут собственно строки? AVK>>А при чем тут собственно то, что в C# замыкания read-only? Вопрос был про передачу параметров в поток, а не про возврат оттуда.
ie>Дык, я оттуда ничего вернуть и не пытаюсь. Разве не так?
AVK>>При необходимости всегда можно передать mutable объект (C# ведь не функциональный язык, в нем это вполне естественно) и менять его, не меняя ссылки. Но к исходному вопросу это никакого отношения не имеет.
ie>Мы уже с Lloyd выяснили, что я не правильно понимал замыкания. Я полагал, что используется значение которое было в момент создания делегата, а не в момент его вызова. Оказалось ровно наоборот.
Выше сказанное абсолютно правильно. Маленькое дополнение — цитата из Ecma-334:
14.5.15.2 Anonymous method blocks
...
The block has access to the outer variables (§14.5.15.3) of the anonymous method. Access of an outer
variable will reference the instance of the variable that is active at the time the anonymous-methodexpression
is evaluated (§14.5.15.4).