Поделиться через


Статические анонимные функции

Заметка

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

Может возникнуть некоторое несоответствие между спецификацией компонентов и завершенной реализацией. Эти различия фиксируются в соответствующих собраниях по проектированию языка (LDM).

Дополнительные сведения о процессе внедрения спецификаций функций в стандарт языка C# см. в статье о спецификациях .

Проблема чемпиона: https://github.com/dotnet/csharplang/issues/275

Сводка

Разрешить модификатор static в лямбда-выражениях и анонимных методах, который запрещает захват локальных переменных или состояния экземпляра из окружающих областей видимости.

Мотивация

Избегайте непреднамеренного захвата состояния из окружающего контекста, что может привести к неожиданному хранению захваченных объектов или неожиданным дополнительным выделениям.

Подробный дизайн

Лямбда-метод или анонимный метод может иметь модификатор static. Модификатор static указывает, что лямбда-метод или анонимный метод является статической анонимной функцией.

статическая анонимная функция не может захватывать состояние из окружающей области. В результате локальные переменные, параметры и this из окружения недоступны внутри статической анонимной функции .

статическая анонимная функция не может ссылаться на данные члены экземпляра через неявную или явную this или base ссылку.

статическую анонимную функцию, может ссылать static членов из заключающей области.

статическая анонимная функция может ссылаться на определения constant из внешней области.

nameof() в статической анонимной функции может ссылаться на локальные переменные, параметры или this или base из охватывающей области.

Правила доступа для членов private во вложенной области одинаковы для static и анонимных функций, не относящихся кstatic.

Не гарантируется, будет ли определение статической анонимной функции отображено как метод static в метаданных. Это оставлено на усмотрение реализации компилятора для оптимизации.

Локальная функция или анонимная функция, не являющаясяstatic, может захватывать состояние из заключающей статической анонимной функции, но не может захватывать состояние за пределами заключающей статической анонимной функции.

Удаление модификатора static из анонимной функции в допустимой программе не изменяет смысл программы.