Est-il une différence entre l'utilisation .GetValueOrDefault (0) et Si (variable, 0) avec des types nullables?

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

Question

Y at-il une différence entre les 2 méthodes suivantes pour le calcul de c ... boxe spécifiquement / questions 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)
Était-ce utile?

La solution

Selon réflecteur, l'IL de l'extrait de code Décompile dans:

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

[EDIT] Et puis en regardant les fonctions Réfléchie GetValueOrDefault() et GetValueOrDefault(T defaultValue) donne les éléments suivants (respectivement):

Public Function GetValueOrDefault() As T
    Return Me.value
End Function

et

Public Function GetValueOrDefault(ByVal defaultValue As T) As T
    If Not Me.HasValue Then
        Return defaultValue
    End If
    Return Me.value
End Function

Indiquant soit sous forme fait effectivement exactement la même chose

Autres conseils

Le c = Si (a, 0) + Si (b, 0) déclaration est compilée à ceci:

  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
en l'état

Le deuxième extrait est compilée exactement. Il est le grand vainqueur ici.

a.GetValueOrDefault(0) est une version légèrement plus efficace de If(a, 0)

a.GetValueOrDefault() est une version légèrement plus efficace de a.GetValueOrDefault(0)

Bien sûr, cela est vrai que pour les types numériques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top