C # Anonymous function-scope - PullRequest
       15

C # Anonymous function-scope

3 голосов
/ 31 июля 2009
var foo = "bar";

new Func<String>(() => 
{
    var foo = ""; // This can't be done in C#. Why is that?

    /* In JavaScript, this is perfectly valid, since this scope (the anonymous
       function) is disconnected from the outer scope, and any variable declared
       within this scope will not affect variables in the outer scope */

})()

Ответы [ 3 ]

13 голосов
/ 31 июля 2009

На самом деле, даже в javascript не полностью отключен; javascript допускает лексические замыкания - поэтому без var старое значение foo все еще должно быть доступно.

Разница в том, что javascript выбирает , чтобы позволить вам повторно объявить имя с другим значением (во внутренней области). C # выбирает , а не.

Я нахожу версию C # менее запутанной! В частности, когда код (далее в методе) ожидает, что он говорит о «старой» переменной, и вдруг он начинает смотреть на «новую».

4 голосов
/ 31 июля 2009

C # захватывает локальные переменные внутри анонимной функции. На самом деле это очень мощная функция, которую также поддерживает JavaScript, но немного по-другому.

Эта концепция - то, что компьютерные ученые называют закрытием . Захватив локальные переменные, они могут стать частью состояния самой функции, что дает вам больше гибкости.

0 голосов
/ 31 июля 2009

Поскольку код ссылается на оба символа как на «локальные», компилятор не может обнаружить то, на что вы ссылаетесь, просто поднимаясь по цепочке областей (local -> member -> type).

К вашему сведению, анонимные методы компилируются как классы и присваиваются (как свойства) любым члены / местные жители они получают доступ как поля.

...