Есть ли разница между использованием .GetValueOrDefault (0) и If (variable, 0) с обнуляемыми типами? - PullRequest
2 голосов
/ 09 марта 2010

Есть ли какая-либо разница между двумя приведенными ниже методами для расчета c ... в частности проблем с боксом / распаковкой?

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)

Ответы [ 3 ]

1 голос
/ 09 марта 2010

Инструкция c = If (a, 0) + If (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

Второй фрагмент кода компилируется точно как есть. Здесь явный победитель.

1 голос
/ 09 марта 2010

Согласно Reflector, 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

Указание на то, что любая форма фактически делает одно и то же

0 голосов
/ 09 марта 2010

a.GetValueOrDefault(0) - немного более эффективная версия If(a, 0)

a.GetValueOrDefault() - немного более эффективная версия a.GetValueOrDefault(0)

Конечно, это верно только для числовыхтипы.

...