靜態匿名函式
注意
本文是功能規格。 規格可作為功能的設計檔。 其中包含建議的規格變更,以及功能設計和開發期間所需的資訊。 這些文章會發佈,直到提議的規格變更完成並併併入目前的ECMA規格為止。
功能規格與已完成實作之間可能有一些差異。 這些差異是在相關 語言設計會議(LDM)記錄中擷取的。
冠軍問題: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
修飾詞並不會變更程序的意義。