¿Hay alguna diferencia entre usar .GetValueOrDefault (0) y Si (variable, 0) con tipos anulables?
Pregunta
¿Hay alguna diferencia entre los siguientes 2 métodos para el cálculo de c ... boxeo específicamente los temas / unboxing?
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)
Solución
De acuerdo con el reflector, la IL desde el fragmento de código en decompiles:
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
[Editar] y, a continuación, mirando el Reflejada funciones GetValueOrDefault()
y GetValueOrDefault(T defaultValue)
dicta la siguiente (respectivamente):
Public Function GetValueOrDefault() As T
Return Me.value
End Function
y
Public Function GetValueOrDefault(ByVal defaultValue As T) As T
If Not Me.HasValue Then
Return defaultValue
End If
Return Me.value
End Function
Indicando una u otra forma lo hace con eficacia exactamente lo mismo
Otros consejos
El c = Si (a, 0) + Si (b, 0) declaración se compila a esto:
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
El segundo fragmento se compila exactamente como está. Es el claro ganador aquí.
a.GetValueOrDefault(0)
es una versión ligeramente más eficiente de If(a, 0)
a.GetValueOrDefault()
es una versión ligeramente más eficiente de a.GetValueOrDefault(0)
Por supuesto, esto sólo es cierto para los tipos numéricos.