Есть ли какая-либо разница между использованием .GetValueOrDefault(0) и If(переменная, 0) с обнуляемыми типами?

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

Вопрос

Есть ли какая - либо разница между двумя приведенными ниже методами вычисления 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)
Это было полезно?

Решение

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

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

Другие советы

Оператор 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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top