描述VB.NET DirectCast運算符
本人很喜歡VB.NET DirectCast運算符,在工作中也很喜歡總結關于VB.NET DirectCast運算符的經(jīng)驗教訓,下面就這個問題來詳細說說吧。VB.NET 能夠?qū)崿F(xiàn)很多C#不能做到的功能,如When語句、Optional參數(shù)、局部Static變量、對象實例訪問靜態(tài)方法、Handles綁定事件、On Error處理異常、Object直接后期綁定等等。VB和C#同屬.NET的語言,編譯出來的是同樣的CIL,但為什么VB支持很多有趣的特性呢。我們一起來探究一下VB.NET DirectCast運算符。
在Visual Basic 2005中將加入一個新的運算符——TryCast,相當于C#的as運算符。我一直希望VB有這樣一個運算符。VB目前的類型轉(zhuǎn)換運算符主要有 CType和DirectCast。他們的用法幾乎一樣。我詳細比較了一下這兩個運算符,得出以下結論:
1、在轉(zhuǎn)換成引用類型時,兩者沒有什么區(qū)別,都是直接調(diào)用castclass指令,除非重載了類型轉(zhuǎn)換運算符CType。VB.NET DirectCast運算符是不能重載的。
2、轉(zhuǎn)換成值類型時,CType會調(diào)用VB指定的類型轉(zhuǎn)換函數(shù)(如果有的話),比如將String轉(zhuǎn)換為Int32時,就會自動調(diào)用 VisualBasic.CompilerServices.IntegerType.FromString,而將Object轉(zhuǎn)換為Int32則會調(diào)用 FromObject。其他數(shù)值類型轉(zhuǎn)換為Int32時,CType也會調(diào)用類型本身的轉(zhuǎn)換方法實施轉(zhuǎn)換。VB.NET DirectCast運算符則很簡單,直接將對象拆箱成所需類型。
所以在用于值類型時,CType沒有DirectCast快速但可以支持更多的轉(zhuǎn)換。在C#中,類型轉(zhuǎn)換則為(type)運算符和as運算符。(type)運算符的工作方式與VB的DirectCast很相似,也是直接拆箱或castclass的,但是如果遇到支持的類型轉(zhuǎn)換(如long到 int),(type)運算符也會調(diào)用相應的轉(zhuǎn)換方法,但不支持從String到int的轉(zhuǎn)換。C#另一個運算符as則更加智能,它只要判斷對象的運行實例能否轉(zhuǎn)成目標類型,然后就可以省略castclass指令,直接按已知類型進行操作,而且編譯器還可以自動對as進行優(yōu)化,比如節(jié)省一個對象引用等。所以在將Object轉(zhuǎn)換成所需的類型時,as是最佳選擇。
由于as有很多優(yōu)點,Visual Basic 2005將這一特性吸收了過來,用TryCast運算符就可以獲得和as一樣的效果,而且語法與VB.NET DirectCast運算符或CType一樣。
【編輯推薦】