静态匿名函数

注意

本文是特性规范。 该规范充当该功能的设计文档。 它包括建议的规范更改,以及功能设计和开发过程中所需的信息。 这些文章将发布,直到建议的规范更改最终确定并合并到当前的 ECMA 规范中。

功能规范与已完成的实现之间可能存在一些差异。 这些差异记录在相关的语言设计会议 (LDM) 说明中。

可以在 规范一文中详细了解将功能规范采用 C# 语言标准的过程。

支持者问题:https://github.com/dotnet/csharplang/issues/275

总结

允许在 lambda 和匿名方法上使用“静态”修饰符,这不允许从包含范围捕获本地或实例状态。

动机

避免无意中从封闭上下文中捕获状态,这可能会导致意外保留捕获的对象或意外的额外分配。

详细设计

lambda 或匿名方法可能有 static 修饰符。 static 修饰符指示 lambda 或匿名方法是 静态匿名函数

静态匿名函数 无法从封闭范围捕获状态。 因此,封闭范围内的局部变量、参数和 this,不可在 静态匿名函数中使用。

静态匿名函数 无法从隐式或显式 thisbase 引用实例成员。

静态匿名函数 可以从封闭范围引用 static 成员。

静态匿名函数 可以从封闭范围引用 constant 定义。

静态匿名函数中的 nameof() 可以从封闭范围引用局部变量、参数或 thisbase

封闭作用域中 private 成员的可访问性规则对于 static 和非static 匿名函数是相同的。

无法保证静态匿名函数定义是否在元数据中作为 static 方法发出。 这留给编译器实现进行优化。

static 本地函数或匿名函数可以从封闭 静态匿名函数 捕获状态,但无法捕获封闭 静态匿名函数之外的状态。

从有效程序中的匿名函数中删除 static 修饰符不会更改程序的含义。