2010-03-09 54 views

回答

1

據的反射器,從您的代碼段的IL反編譯成:

Public Shared Sub Main() 
    Dim a As Integer? = 10 
    Dim b As Integer? = Nothing 
    Dim c As Integer = (IIf(a.HasValue, a.GetValueOrDefault, 0) + IIf(b.HasValue, b.GetValueOrDefault, 0)) 
    c = (a.GetValueOrDefault(0) + b.GetValueOrDefault(0)) 
End Sub 

[編輯],然後着眼於反射功能GetValueOrDefault()GetValueOrDefault(T defaultValue)給出以下(分別):

Public Function GetValueOrDefault() As T 
    Return Me.value 
End Function 

and

Public Function GetValueOrDefault(ByVal defaultValue As T) As T 
    If Not Me.HasValue Then 
     Return defaultValue 
    End If 
    Return Me.value 
End Function 

表示是形式確實有效完全一樣的東西

0

a.GetValueOrDefault(0)If(a, 0)

a.GetValueOrDefault()略微更有效版本的a.GetValueOrDefault(0)

當然稍微更高效的版本,這是唯一的真正的數字類型。

1

中的C =若(a,0)+如果(B,0)語句被編譯此:

Dim tmpa As Integer 
    If a.HasValue Then 
    tmpa = a.GetValueOrDefault() 
    Else 
    tmpa = 0 
    End If 
    Dim tmpb As Integer 
    If b.HasValue Then 
    tmpb = b.GetValueOrDefault() 
    Else 
    tmpb = 0 
    End If 
    c = tmpa + tmpb 

第二片段被編譯恰好原樣。這裏是明顯的贏家。

相關問題