歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

VB 2015 的 閉包(Closure)

是的,你沒看錯,這篇文章講的不是 ECMAScript 。

目前 VB 14 比 C# 6 領先的功能裡面,有個即將在 C# 7 實現的功能,叫做“本地方法”。這個功能與“匿名委托”的區別是:匿名委托不能直接存儲到自動推斷類型(在C#為var)的變量裡,必須賦值給已經指定委托類型的變量,或者作為參數傳遞。而且匿名委托不允許聲明為迭代器。

利用這個特性,可以 隨便抄網上的JS/ES的代碼  更方便地使用委托,但是需要注意使用閉包規避一些非預期的結果。

本地方法會像其它的Lambda表達式或匿名委托一樣,捕獲上下文的變量。

 

本地方法裡面的成員不能在外部訪問,因為變量重名了。

如果你不用 Dim 關鍵字 並且使用 Option Explicit Off,那麼沒有聲明變量會是方法級別的變量。注意,不是全局變量。

那麼,怎樣把本地方法裡面的變量取出呢?

這時就需要定義另一個本地方法

執行的結果是彈出一個消息框,內容是 999。

那這個寫法有什麼實際作用呢?

執行結果:消息框內容: 999, 消息框內容:1000

這段代碼中的 f2 把 f1 中定義的 n 變量取了出來。委托 nAdd 修改了 f1 中定義的變量 n 的值。

這種寫法在本地方法中有效,因為本地方法中定義的一切變量會通過名稱類似於 _Closure$__2-0 這樣的類包裝,然後放置到它所在的普通方法的變量區進行存儲。

包含本地方法的普通方法執行完畢之後,_Closure$__2-0 這樣的變量包裝類會脫離作用域,從而導致這個方法裡面的定義的本地方法中的變量隨時可以被GC回收。

警告:這些寫法不要在最終發售的產品中使用,因為後期綁定會帶來性能問題,而且不聲明變量會讓你的代碼裡面有一堆警告(綠色的浪線)。

留個兩個思考題

第一題:消息框裡面寫著什麼?

提示:那個綠色的浪線是VS告訴你這樣寫可能結果跟你想的不一樣

第二題:消息框裡面寫著什麼?

這回沒提示了

Copyright © Linux教程網 All Rights Reserved