Есть ли какая-либо разница между использованием .GetValueOrDefault(0) и If(переменная, 0) с обнуляемыми типами?
Вопрос
Есть ли какая - либо разница между двумя приведенными ниже методами вычисления 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)
Конечно, это верно только для числовых типов.