关于Visual Basic 10.0
隨著VS2010早期CTP的放出,大家對下一代開發系統的期待熱情又一次掀起了。除了已經開始被大家嘗鮮的C#4以外,Visual Basic也進化成了10.0。不過據我觀察,VB10的改變還沒有C#4那么明朗,我們目前的確可以看到一些語法上的變化,然而似乎VB10并未真正接近完工的地步,還有很多特性有待繼續開發。大家也許還記得VB9引入的令人眼前一亮的XML集成語法,使得VB擁有了業界最為緊密的XML集成。但VB需要編譯才能使用,這一點阻礙了VB強大的XML處理能力和動態能力,如果VB變成一個完全動態的編程語言,包括腳本化運行的能力,那么VB使用方便的特點將再一次發揮出來。但是VS2010 CTP中尚未看到基于新DLR的VB編譯器。我們能看到的仍然是一個靜態編譯的VB10。所以我這次主要介紹一下VB語法方面的改進,更多改進等到VS2010來臨之際自然會知曉。
1.?????? 隱式續行符
用過VB的人都知道VB的語句是寫成一行一行的,無需分號隔離。一般情況下語句只能寫成一行,不能換行。而從VB5.0開始,如果覺得語句寫成一行太長,可以加入續行符(line continuation)來換行。比如說:
| <HideModuleName()> _ Module Module1 ? ??? <STAThread()> _ ??? Sub Main() ??????? Dim message = "Your directory is" & _ ?? ?????????Environment.CurrentDirectory() ? ??????? Dim l As New List(Of Integer) ??????? Dim r = From item In l _ ??????????????? Where item > 0 AndAlso item < 100 _ ??????????????? Select Number = item.ToString() ??? End Sub ? ??? Function Foo(ByVal x As Integer, _ ???????????????? ByVal y As String, _ ???????????????? ByVal z As Double) As Single ??? End Function End Module |
我們可以看到這段代碼中多處出現了續行符(就是一個空格加一個下劃線)。無論是Attribute應用語法,還是表達式、Linq表達式或函數簽名,都必須用續行符來換行。
首先我們說換行并非必須,而僅僅是為了美觀。像Linq這樣的語法出現之后,換行書寫就成了很多人的迫切需要。因此VB10改進了語法,引入了隱式換行符的概念。當VB能夠判斷一行語法未完的上下文,就會自動將緊接的一行視為續行,而無需顯示加入續行符。這樣一來在常見的場合,你就可以任意換行,充分發揚Basic語言的自由風格了:
| <HideModuleName()> Module Module1 ? ??? <STAThread()> ??? Sub Main() ??????? Dim message = "Your directory is" & ?? ?????????Environment.CurrentDirectory() ? ??????? Dim l As New List(Of Integer) ??????? Dim r = From item In l ??????????????? Where item > 0 AndAlso item < 100 ??????????????? Select Number = item.ToString() ??? End Sub ? ??? Function Foo(ByVal x As Integer, ???????????????? ByVal y As String, ???????????????? ByVal z As Double) As Single ??? End Function End Module |
這樣一來清爽多了。不過隱式續行符和顯式續行符一樣,有個小小的缺陷,就是不能在后面插入注釋。據說這是VB IDE團隊過分依賴于此特性,以至于超多歷史代碼無法一一改變造成的……
2.?????? 多行Lambda表達式和方法型Lambda表達式
VB2008為了支持Linq已經引入了Lambda表達式的概念。但VB2008的Lambda表達式有局限性,只能是函數形態(必須有返回值),同時最多只能含有一個表達式,所以無法加入多行語句。雖然函數式編程僅支持一行語句也可編寫,但若能支持多行語句就能擴大與VB傳統語法的結合能力。比如說可以用在PLinq等場合。語法非常簡單,就如同是將Sub和Function寫在了方法體內部一樣:
| Dim f = Function(x) x + 1 '函數形態Lambda Dim g = Sub(x) Console.WriteLine(x) '方法形態Lambda Dim h = Function(x, y) '多行語句函數 ??????????? Dim z = x`+ y ??????????? Return 2 * Math.Squr(Z) ??????? End Function ? Dim i = Sub() '多行語句子程序 ??????????? f(1) ??????????? g(2) ??????????? h(3, 4) ??????? End Sub |
多行Lambda和語句型Lambda都可以捕獲局部變量,完成函數式的諸多算法。他們同樣也基于匿名委托工作。有了此工具,就可以更有效地在VB中進行函數式風格的編程了。
3.?????? 數組、集合和字典的初始化語句。
這個新特性是VB9日程過于緊迫而被砍掉的特性,其實和C#的類似功能是一樣的。首先,VB10引入了一個純粹的數組字面量。無需任何修飾,下列語法就表示一個強類型數組:
| {1, 2, 3, 4} |
編譯器會自動推測它是Integer類型的數組。這個表達式不僅僅可以用于賦值,還可以直接出現在需要數組的上下文中。這是個很好的特性,基于一些Linq操作,VB也可以像函數式語言操作“表”一樣,在數組上進行一些眼花繚亂的算法了。同時,List(Of T)和Dictionary(Of TKey, TValue)類型也可以用類似的表達式初始化。暫定關鍵字為From:
| Dim l As New List(Of Integer) From {1, 2, 3, 4} Dim d As New Dictionary(Of String, Double) From {{"A", 1}, {"B", 2}} |
其實我個人感覺字典的初始化語法應該像JSON語法那樣才好。。。
4.?????? 泛型接口和泛型委托的協變、反變性
我們都知道.NET泛型是不允許任何形式的協變或反變的。也就是說Foo(Of T)是不可能轉成Foo(Of U)的,不管T和U之間有什么樣的關系。用過Java泛型的人可能會對此表示疑問。但其實仔細一想不難發現,泛型參數T在這個類型中如何被使用我們是不能加以約束的。因此T既可能出現在成員函數的參數上,也可能出現在返回值上。因此允許協變必然會導致某種類型不安全的現象發生?,F在CLR增加了一種新的描述泛型類型參數的方法,可以限定類型參數只能用于方法的參數或返回值。這樣就使得安全的協變成為可能。VB10為此提供了兩種語法(僅能用于聲明泛型接口和泛型委托,不能用于泛型類或泛型方法):
| Interface IFoo(Of In T) ??? Sub Foo(ByVal x As T) End Interface ? Interface IBar(Of Out T) ??? Function Bar() As T End Interface |
其中被In修飾的泛型類型參數僅能在接口或委托中用于函數的參數類型,而被Out修飾的泛型類型參數則只能用于返回值類型。
加上這樣的修飾之后,該接口就允許某些條件下的協變或反變了。首先,IFoo(Of In T)將可以反變成IFoo(Of In U),當且僅當U繼承自T。比方說IComparable(Of Object)將能夠反變成IComparable(Of String)。因為IComparable(Of In T)擁有In的修飾。接下來IBar(Of Out T)也將可以協變成IBar(Of Out U),當且僅當T繼承自U。比如IEnumerable(Of String)將能夠協變成IEnumerable(Of Object)。注意達成協變和反變的條件僅僅是繼承關系,而且必須都是引用類型。值類型泛型和引用類型泛型因為有不同的JIT已構建類型(Constructed Type),所以是不能運行時協變的。
綜上所述,VB10目前放出來的主要改進就是一些語法方面的完善工作。VB從很久以前就已經為動態大潮做好了準備,C#4的大部分新特性(例如dynamic,可選參數,命名參數)全部都是10年前VB就已經擁有的?,F在VB將傳統的動態能力與新的DLR結合在一起,加上XML語法的卓越威力,必將成為.NET 4時代重要的動態語言。后續新特性,待官方發布后將繼續研究和報道。
轉載于:https://www.cnblogs.com/Ninputer/archive/2008/11/03/vb10firstlook.html
總結
以上是生活随笔為你收集整理的关于Visual Basic 10.0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vb.net中类型转换
- 下一篇: [asp常用代码]文件上传代码