Статические анонимные функции
Заметка
Эта статья является спецификацией компонентов. Спецификация служит проектным документом для функции. Она включает предлагаемые изменения спецификации, а также информацию, необходимую во время проектирования и разработки функции. Эти статьи публикуются до тех пор, пока предложенные изменения спецификации не будут завершены и включены в текущую спецификацию 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
из анонимной функции в допустимой программе не изменяет смысл программы.
C# feature specifications