C'è qualche differenza tra l'utilizzo .GetValueOrDefault (0) e se (variabile, 0) con i tipi nullable?
Domanda
C'è qualche differenza tra i 2 metodi indicati per il calcolo dei c ... specificamente boxe problemi / 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)
Soluzione
Secondo Reflector, l'IL da snippet di codice decompila in:
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] E poi guardando le funzioni GetValueOrDefault()
riflessa e GetValueOrDefault(T defaultValue)
ha pronunciato la seguente (rispettivamente):
Public Function GetValueOrDefault() As T
Return Me.value
End Function
e
Public Function GetValueOrDefault(ByVal defaultValue As T) As T
If Not Me.HasValue Then
Return defaultValue
End If
Return Me.value
End Function
Indicando sia in forma fa in modo efficace esattamente la stessa cosa
Altri suggerimenti
Il c = Se (a, 0) + Se (b, 0) dichiarazione viene compilato a questo:
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
Il secondo frammento viene compilato esattamente così com'è. E 'il chiaro vincitore qui.
a.GetValueOrDefault(0)
è una versione leggermente più efficiente di If(a, 0)
a.GetValueOrDefault()
è una versione leggermente più efficiente di a.GetValueOrDefault(0)
Naturalmente, questo è vero solo per i tipi numerici.