Visual Basic 11新特性一覽
作者 Jonathan Allen 譯者 曹如進
Visual Basic 11 推出了一些新特性,其中包括異步函數和期待已有的迭代器。
Visual Basic 中的異步支持與 C# 中的版本一樣。兩者均使用相同的設計和關鍵字(即 Async 和 Await),并且背后支撐這些關鍵字的都是 .NET 4.0 引入的任務并行庫(Task Parallel Library)。
盡管異步函數從理論上來說可以在任意地方使用,但是其主要目的還是為了防止敏感線程(sensitive thread)發生阻塞,例如,你可以在 WPF 或 Silverlight 應用程序的 UI 線程中使用異步函數進行文件操作、服務調用或數據庫請求。異步操作完成后會自動回歸 UI 線程,而不會在此期間造成阻塞。
ASP.NET 線程池中的線程是另一個敏感線程的例子。一般情況下,ASP.NET 會限制并發線程的數量,以防止過多的上下文切換導致性能退化。這個數量通常會設置成一個任意的基數,而后當運行時(Runtime)檢測到大量阻塞時再進 行增長。若改用異步、非阻塞調用,系統運行將更接近于理想的“one thread-per-core”模型。
Visual Basic 11 同時支持迭代器函數(iterator function)和迭代器塊(iterator block)。其中迭代器函數類似于 C# 中的迭代器,只是語法稍有改動。在 VB 中,迭代器函數必須被聲明為“Iterator Function”而不僅是“Function”關鍵字。VB 開發人員使用“Yield [expression]”來返回結果值,這與 C# 中使用“yield return [expression]”不一樣。
VB & C#語言組程序經理 Anthony Green 談到:
Iterator 關鍵字雖然使我們避免了對那些使用 Yield 作為標識符(如金融相關的應用程序)的現存源文件造成破壞,雖然為我們提供了一個簡潔的 Yield 關鍵字而非關鍵字對 Yield Return,但這些并不是它出現的唯一原因。一般情況下,VB 都會有一種聲明風格(如 XML literal、Handle 和 Implement)。我們認為,VB 中的代碼應當可以“顧名思義”,即如果一個函數是迭代器函數,那么代碼就應當寫明這點。當然,如果人們就把他們當做 Iterator 和 Async 函數調用,其實也能夠運行。你可以從 VB 其他修飾符,如 ReadOnly 和 WriteOnly 屬性中看到這種模式——如果屬性沒有 Setter 部分,那么從語義上就意味著它是 ReadOnly,從而在聲明時就可以為屬性加上 ReadOnly 修飾符。
顯式聲明修飾符的另一個好處在于,我們可以提供一個更好的編輯器體驗。在 VB 中,當你鍵入“Iterator Function F As Integer”時,IDE 會自動為你插入“IEnumerable (Of Integer)”。類似地,如果你鍵入“Async Function F As Integer”,IDE 會為你將“As Integer”替換成“As Task (Of Integer)”。這就像為屬性添加 ReadOnly 修飾符一樣,我們可以借助這些信息自動生成更優質的代碼。
有趣的是,VB11還支持一種 lambda 表達式——迭代器塊。下面的例子使用 lambda 表達式創建“IEnumerable (Of Integer)”對象并對其進行遍歷。迭代器塊還可以通過在“End Function”行結束后附加“.Invoke ()”用在 XML literal 中。
同 C# 一樣,Visual Basic 11 也支持 CallerMemberName、CallerLineNumber 和 CallerFilePath 特性。在應用這些特性之后,編譯器會自動計算出行號、文件路徑等值,并將它們作為可選參數進行傳遞。這些特性用得最多的兩處地方是日志記錄和屬性變更通知 事件。
VB11中的其他改進包括:
- 引入 Global 命名空間,用于代碼生成;
- 為重載函數加入可選參數,支持部分向后兼容;
- 消除方法簽名中的 ByVal 關鍵字。IDE 自動添加 ByVal 關鍵字最初是因為 Visual Basic 7 將默認傳值方式由引用傳遞變為值傳遞。
查看英文原文:http://www.infoq.com/news/2012/03/VB-11