是否有使用.GetValueOrDefault(0),如果(变量,0)可空类型之间有什么区别?

StackOverflow https://stackoverflow.com/questions/2405923

是否有用于计算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)的稍微更有效的版本

当然,这仅仅是为数字类型实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top