2008年2月20日

轉型的奧妙



在Visual Basic中,大家都習慣使用Ctype作轉型,但是轉型其實還有其他作法。

DirectCast

根據MSDN說明:
DirectCast 不會將 Visual Basic 執行階段 Helper 常式用於轉換,因此在資料型別 Object 間進行轉換時,它可提供的效能比 CType 還好

DirectCast 需要這兩個引數之資料型別之間的繼承實作關聯性。這表示其中一個型別必須繼承自另一個型別或實作另一個型別。

如果 DirectCast 偵測到沒有繼承或實作關聯性存在,則會產生編譯器錯誤。但沒有編譯器錯誤並不保證轉換成功。

下列的程式在編譯的時候就會出現錯誤。

Function xxx(ByVal str As String) As String
Return DirectCast(str, Integer)
End Function


TryCast

根據MSDN說明:
如果轉換嘗試失敗,CType 和 DirectCast 兩者會擲回 InvalidCastException 錯誤。這可能會對應用程式效能造成不利影響。TryCast 傳回 Nothing (Visual Basic),如此即不必處理可能的例外狀況,只需要針對 Nothing 測試傳回的結果

它需要兩個型別之間的繼承實作 (Implementation) 關係。這表示其中一個型別必須繼承自另一個型別或實作另一個型別。

如果 TryCast 未偵測到繼承或實作關聯性,則會產生編譯器錯誤。但沒有編譯器錯誤並不保證轉換成功。

下列的程式在編譯的時候就會出現錯誤。

Function PrintTypeCode(ByVal obj As Object) As String
Dim objAsConvertible As IConvertible = TryCast(obj, IConvertible)
If objAsConvertible Is Nothing Then
Return obj.ToString() & " does not implement IConvertible"
Else
Return "Type code is " & objAsConvertible.GetTypeCode()
End If
End Function

4 則留言:

  1. 請問一下
    前輩是否待過ICSC
    因為我在裡面的論壇看到跟你一樣的暱稱
    只是問問沒別的意思

    我剛來這 想要重振這裡.Net的論壇
    因為空了兩年沒更新了

    回覆刪除
  2. 嗯嗯, 我是待到去年中. 你是那個部門的?.NET Team?

    那個論壇很像很少人看阿...Orz

    回覆刪除
  3. 肉塔被認出來了啦~XD
    以後不可以做壞事...

    ㄎㄎㄎ

    回覆刪除
  4. 我是k32
    這個部門幾乎全新
    除了幾個資深人員
    大部分都是.net菜鳥
    看來有很多東西該學了

    回覆刪除

[Info] 如何快速找到Fix it?

  台灣微軟目前提供了很多的Fix it,讓許多消費者可以不用看完整篇KB,只要按下一個按鈕,就可以幫使用者自動修正許多問題. 現在在Vista以及Windows 7上,微軟也提供了SideBar工具,讓你用最短的時間找到能修正您的電腦的Fix it.(目前為英文版本) ...