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