Est-il une différence entre l'utilisation .GetValueOrDefault (0) et Si (variable, 0) avec des types nullables?
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)
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.