是否有使用.GetValueOrDefault(0),如果(变量,0)可空类型之间有什么区别?
题
是否有用于计算c ^ ...具体地说装箱/拆箱问题?下面的2种方法之间的任何差异
Dim a As Integer? = 10
Dim b As Integer? = Nothing
Dim c As Integer
' Method 1
c = If(a, 0) + If(b, 0)
' Method 2
c = a.GetValueOrDefault(0) + b.GetValueOrDefault(0)
解决方案
据的反射器,从您的代码段的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
和
Public Function GetValueOrDefault(ByVal defaultValue As T) As T
If Not Me.HasValue Then
Return defaultValue
End If
Return Me.value
End Function
指示任一种形式确实有效地完全一样的东西
其他提示
中的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
在第二片段被编译恰好原样。这是明显的赢家在这里。
a.GetValueOrDefault(0)
是If(a, 0)
的稍微更有效的版本
a.GetValueOrDefault()
是a.GetValueOrDefault(0)
的稍微更有效的版本
当然,这仅仅是为数字类型实现。
不隶属于 StackOverflow