概述
Microsoft 今年 10 月宣布正式命名下一代開發平臺和工具為 Microsoft .NET Framework 4.0 以及 Visual Studio 2010。Visual Studio 2010 先前代號 dev10,包含 Microsoft 最新的開發平臺創新和擴展。本文通過 2008 年 10 月 27 號發布的 Visual Studio 2010 CTP 版本向大家完整介紹了 Visual Basic 10(代號 VBX)在該平臺上的新增功能。
在本文中的內容
· 數組初始值設定項
· 集合初始值設定項
· 內聯 Lambda 表達式
· 自動實現屬性
· 泛化
· No-PIA 部署
· 與 Python 的集成
· 并行計算擴展
數組初始值設定項(Array Literals)
Visual Basic 9.0 在對一個數組類型的變量進行初始化賦值時,可以通過隱式類型本地變量(Type Inference)由編譯器推斷該數組是什么類型。例如:
Dim strings = New String() { “A”, “B”, “C” }
Dim integers() = { 1, 2, 3, 4, 5 }
Visual Basic 10 增強了這一功能,在現在的版本中,我們不僅可以利用 Dim 語句聲明隱式類型變量,而且可以在接受參數的函數調用中使用。例如,在一個接受 String 數組類型的 SearchPath 函數調用,就可以使用如下形式。
Dim results() = SearchPath( { “C:\”, “D:\”, “E:\” })
集合初始值設定項(Collection Initializer)
集合初始值設定項在 C# 3.0 中已經被引入,例如,我們現在需要對一個 List
Dim list = New List(Of String)
list.Add(“string1”)
list.Add(“string2”)
list.Add(“string3”)
但在 Visual Basic 10 中,也可以和 C# 一樣直接初始化了。例如上面的代碼可以簡寫為如下代碼。
Dim list = New List(Of String) From { “string1”, “string2”, “string3” }
這里的 From 關鍵字表明了該初始值從后面的集合中獲得,這樣的語法等同于前面所描述的利用 List.Add() 方法添加數據,不同的是 CLR 為我們完成了三次 Add() 方法的調用。
結合上面提到的兩項創新,我們可以大大簡化初始化變量的語法。例如。
Dim students = List(Of Student) From { _
New Student With { .Name := “Mark”, .Age := 24, .PhoneNumbers := { “123-XXX-XXXX”, “XXX-XXX-XXXX” } },
New Student With { .Name := “Evan”, .Age := 22, .PhoneNumbers := { } }
}
Public Class Student
Public Name As String
Public Age As Integer
Public PhoneNumbers As List(Of String)
End Class
內聯 Lambda 表達式(Inline Lambda Expressions)
Visual Basic 9 引入了 Lambda 表達式,但由于 Visual Basic 的行結束符為回車,導致如果我們需要在 Lambda 函數體中執行多項操作時會很麻煩,C# 可以用括號將語句括起來形成語句塊來解決這個問題,但 Visual Basic 就只能利用冒號將多個語句分開。
Visual Basic 10 提供了新的內聯 Lambda 表達式支持,使得這一類問題可以順利解決。如下面代碼所示。
Dim t = New Thread(Sub()
myWorkingThread.Sleep(200)
myBackgroundThread.Suspend()
End Sub)
或者這樣。
Dim f As New Func(Of Integer, Integer)
f = Function(x As Integer) As Integer
If x < 2 Then
Return 1
Else
Return f(x – 1) + f(x - 2)
End Function
Console.WriteLine(“10th element of Fibonaclearcase/" target="_blank" >cci is: {0}”, f(10))
自動實現屬性(Auto Implemented Properties)
自動實現屬性和 C# 中的相同概念是完全一致的。某些情況下,我們對屬性的用途都是對私有字段的封裝,那么在這種情況下,Get 和 Set 函數就可以省略。這種場景京城應用在 XML 序列化和數據集的 OR 模型中。
下面的代碼演示了 Visual Basic 10 中的自動實現屬性的用法。
Public Class Student
Public Property Name As String = String.Empty
Public Property Age As Integer = -1
Public Property PhoneNumbers As List(Of String) = New List(Of String)
End Class
泛化(Variance)
泛化的概念涉及到在泛型類型參數中的運行時轉化。我們舉一個例子,如果我們需要實現一個 RSS 源的訂閱系統,我們的設計中可能包含一個 RssFeed(Of RssFeedItem) 的類,由于各個提供商的 RssItem 定義不同,則會導致有很多 RssItem 的繼承類,如應用在 Windows Live Spaces 中的 WindowsLiveRssFeedItem 就繼承自 RssItem 類,從而會產生 WindowsLiveRssFeed 的 RSS 源定義類。如果我們需要批量處理這些訂閱的 RSS 源(也就是 RSSFeed 的繼承類),則我們在編寫漢書實現時,應使用基類型作為入口參數的類型。如。
Sub ProcessFeeds(ByVal feeds As RssFeed(Of RssFeedItem))
…
End Sub
如果我們這樣傳遞一個參數給上述函數,編譯器會怎樣呢?
Dim rss = New RssFeed(Of WindowsLiveRssFeedItem)
ProcessFeeds(rss)
大家可能認為完全可以編譯通過,沒問題。但奇怪的事情發生了,編譯器報告:無法將類型從 RssFeed(Of WindowsLiveRssFeedItem) 轉換為 RssFeed(Of RssFeedItem)。
這是很顯然的,泛型類型是強類型,泛型參數不同的兩個泛型類的類型是不一樣的,這時。我們必須在設計時利用 Cast 語句在運行時期間動態轉換WindowsLiveRssFeedItem 為 RssFeedItem,這回引起性能問題和不必要的開銷。
Visual Basic 10 通過將該泛型參數泛化來解決這個問題。在聲明泛型類型時,通過在泛型參數前增加 Out 修飾就可以了。例如。
Class RssFeed(Of Out RssFeedItem)
…
End Class
則以上的代碼就能正常工作。C# 4.0 同樣增加了這個語法。我們還了解到,IEnumerable
這個功能如何工作的?Visual Basic Team 的一個 Dev 并沒有透露,我們期待更加合理的解釋。
No-PIA 部署(No PIA Deployment)
我們在編寫基于 Microsoft Office 的應用程序時,往往需要部署一堆 VSTO 的 Runtime 程序集,但有時候我們編寫一些應用程序時,僅僅調用了這些 Interop 程序集中很少的功能。例如僅僅保存或打開了一個 Excel 表格等,如果每次部署這樣的應用程序都需要分發整個 PIA(Primary Interop Assemblies)的話就顯得多此一舉。在新的 Visual Basic 中,可以將一個 PIA 程序集的屬性設置為 Embedded 來講其用到的對象引用內嵌到您自己的程序集中,這樣就避免了分發整個 VSTO Runtime 的臃腫部署方式。
與 Python 的集成
Visual Basic 10 提供了一個 Python 的適配器,可以動態的啟動一個 Python 運行時,并通過對象來與 Python 運行時通訊完成共同協作。例如,您可以動態的啟動一個 Python 解釋器,并在該實例下聲明一個 Python 的 string 類型變量,然后通過 .NET Framework 的 Console.Write() 方法將其輸出。
Python 集成功能在目前的 CTP 版本并不可用。預計在 Visual Studio 2010 Beta 1 才真正提供這些特性支持。
并行計算擴展(Parallel Computing Extensions)
并行計算組已經準備好講其并行計算擴展引入到 .NET Framework 4.0。并行計算針對多核處理器的計算機系統進行特別優化,從而充分利用 CPU 時間片并大大提供工作效率。目前,并行計算的 CTP 版本已經在 Microsoft 下載中心提供,大家有興趣可以下載后試用。
并行計算擴展擴展了一個擴展方法 AsParallel(),增加類 Parallel 和 Future,并提供了一個任務管理器,專門用來對任務進行分配、管理和執行。并行計算擴展還提供了 PLINQ 語法,用來方便的將現有代碼并行化。
下面代碼一段適用 PLINQ 的代碼。
Dim threads = GetWorkingThreads()
Parallel.ForAll(Sub(i)
Console.WriteLine(i.ThreadID)
End Sub)
Dim integers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
Dim odds = From p In integers.AsParallel() _
Where p Mod 2 = 1 _
Select p
For Each item In odds
Console.WriteLine(item)
Next
結論
Visual Basic 10 針對 DLR 作了更多的創新和優化,并在 COM 互操作性方面進行了改進。Visual Basic 10 在很多語言特性上已經和 C# 同步,這使得 Visual Basic 更加具備實力成為世界上一流的開發語言工具。
原文轉自:http://www.anti-gravitydesign.com