C 的未來 閉包註解

2021-09-17 08:31:37 字數 2097 閱讀 4053

在「有一定興趣」列表上的下一條提議是相當有爭議的,這條關於lambda捕獲列表的提議假設,它能夠對閉包中的變數捕獲提供更多的控制能力。

\\ 這條提議一上來就講到了捕獲列表,這是一種常見於c++中的概念。以下的示例中包含了乙個常見的閉包,以及乙個用捕獲列表所描述的閉包:

\\var x = 100;\\

func\u0026lt;int\u0026gt; a = () =\u0026gt; x * 2;\\

func\u0026lt;int\u0026gt; b = [x] () =\u0026gt; x * 2;

\\ 一旦使用這種語法,那麼任何乙個沒有出現在捕獲列表(由中括號[x]表示)中的變數都無法在匿名方法中使用,否則將會產生乙個編譯錯誤。如果你在這裡使用了乙個空的列表,那麼將不會建立任何閉包。這種做法對效能來說有好處,因為不產生閉包的匿名函式將無需進行記憶體分配。

\\ 如果要在閉包中訪問當前物件,需要通過使用[this]關鍵字,這種方式也能夠減少在無意中捕獲當前物件的可能性,因為這會導致記憶體的洩漏。

\\按值捕獲

\\ 有些情況下,你在閉包中只需要使用某個值的拷貝,而並不想讓它與原始值共享同乙個變數。在這條提議中, 你可以通過以下方式使用捕獲列表來表現這一行為。

\\ func\u0026lt;int\u0026gt; c = [int xcopy = x]() =\u0026gt; xcopy * 2;

\\ 這種語法非常冗長,因此在提議中也提出了以下幾種替代方式,它們的含義是完全相同的。

\\ func\u0026lt;int\u0026gt; d = [value x]() =\u0026gt; x * 2; //this x is a copy\

func\u0026lt;int\u0026gt; e = [val x]() =\u0026gt; x * 2; //this x is a copy\\

func\u0026lt;int\u0026gt; f = [let x]() =\u0026gt; x * 2; //this x is a copy\\

func\u0026lt;int\u0026gt; g = [=x]() =\u0026gt; x * 2; //this x is a copy

\\ 提議中還建議使用以下語法,讓常見的按引用捕獲的閉包更為明確:

\\ func\u0026lt;int\u0026gt; h = [ref x]() =\u0026gt; x * 2; //x is an alias(別名)\

func\u0026lt;int\u0026gt; i = [\u0026amp;x]() =\u0026gt; x * 2; //x is an alias

\\ 與之相關的乙個提議是使用「細箭頭」(使用單橫線代替等號),它將隱式地按值捕獲所有變數。

\\ func\u0026lt;int\u0026gt; j = () -\u0026gt; x * 2; //this x is a copy

\\弱引用捕獲

\\ 正如之前所述,由於閉包的生命週期比建立它的函式更長,因此它是一種造成記憶體洩漏的常見原因。因此miguel do icaza建議在這條提議中加入弱引用的使用,stephen toub對此提出了以下語法:

\\ action k = [weak myobject] () =\u0026gt; […]\

action l = [weak this] () =\u0026gt; […]\\

action m = [wro = new weakreference(myobject)] () =\u0026gt; […]

\\批評意見

\\ 正如在介紹中所說,這條提議是富有爭議的。無論你選擇了哪種變種形式,新的語法都會讓**顯得相當雜亂。而且對於簡短的閉包來說,語法中所包含的資訊很可能你早就從**本身看出來了。

\\ 為了支援向後相容,捕獲列表的使用必須是可選的。而由於它的語法實在是非常冗長乏味,所以大多數開發者很可能不願意使用它,那麼這個特性存在的意義就令人懷疑了。

\\檢視英文原文:c# futures: closure annotations

C 的未來 閉包註解

在 有一定興趣 列表上的下一條提議是相當有爭議的,這條關於lambda捕獲列表的提議假設,它能夠對閉包中的變數捕獲提供更多的控制能力。這條提議一上來就講到了捕獲列表,這是一種常見於c 中的概念。以下的示例中包含了乙個常見的閉包,以及乙個用捕獲列表所描述的閉包 var x 100 func u0026...

閉包 Python中的閉包

通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...

理解C 中的閉包

內層的函式可以引用包含在它外層的函式的變數,即使外層函式的執行已經終止。但該變數提供的值並非變數建立時的值,而是在父函式範圍內的最終值。使用閉包,我們可以輕鬆的訪問外層函式定義的變數,這在匿名方法中普遍使用。比如有如下場景,在winform應用程式中,我們希望做這麼乙個效果,當使用者關閉窗體時,給使...