静态匿名函数
注意
本文是特性规范。 该规范充当该功能的设计文档。 它包括建议的规范更改,以及功能设计和开发过程中所需的信息。 这些文章将发布,直到建议的规范更改最终确定并合并到当前的 ECMA 规范中。
功能规范与已完成的实现之间可能存在一些差异。 这些差异记录在相关的语言设计会议 (LDM) 说明中。
可以在 规范一文中详细了解将功能规范采用 C# 语言标准的过程。
支持者问题:https://github.com/dotnet/csharplang/issues/275
总结
允许在 lambda 和匿名方法上使用“静态”修饰符,这不允许从包含范围捕获本地或实例状态。
动机
避免无意中从封闭上下文中捕获状态,这可能会导致意外保留捕获的对象或意外的额外分配。
详细设计
lambda 或匿名方法可能有 static
修饰符。 static
修饰符指示 lambda 或匿名方法是 静态匿名函数。
静态匿名函数 无法从封闭范围捕获状态。
因此,封闭范围内的局部变量、参数和 this
,不可在 静态匿名函数中使用。
静态匿名函数 无法从隐式或显式 this
或 base
引用实例成员。
静态匿名函数 可以从封闭范围引用 static
成员。
静态匿名函数 可以从封闭范围引用 constant
定义。
静态匿名函数中的 nameof()
可以从封闭范围引用局部变量、参数或 this
或 base
。
封闭作用域中 private
成员的可访问性规则对于 static
和非static
匿名函数是相同的。
无法保证静态匿名函数定义是否在元数据中作为 static
方法发出。 这留给编译器实现进行优化。
非static
本地函数或匿名函数可以从封闭 静态匿名函数 捕获状态,但无法捕获封闭 静态匿名函数之外的状态。
从有效程序中的匿名函数中删除 static
修饰符不会更改程序的含义。