¿Hay alguna diferencia entre usar .GetValueOrDefault (0) y Si (variable, 0) con tipos anulables?

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

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)
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top