Gibt es einen Unterschied zwischen der Verwendung von .GetValueOrDefault (0) und If (Variable, 0) mit Nullable-Typen?
Frage
Gibt es einen Unterschied zwischen den zwei folgenden Methoden für die Berechnung c ... speziell / Unboxing Ausgaben Boxen?
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)
Lösung
Nach Reflektor, der IL aus dem Code-Schnipsel dekompiliert 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
[Bearbeiten] und dann Blick auf die Reflektierte Funktionen GetValueOrDefault()
und GetValueOrDefault(T defaultValue)
gibt die folgende (jeweils):
Public Function GetValueOrDefault() As T
Return Me.value
End Function
und
Public Function GetValueOrDefault(ByVal defaultValue As T) As T
If Not Me.HasValue Then
Return defaultValue
End If
Return Me.value
End Function
, das entweder Form tut effektiv genau die gleiche
Andere Tipps
c = Wenn (a, 0) + Wenn (b, 0) Erklärung wird dazu zusammengestellt:
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
Der zweite Schnipsel kompiliert wird genau so, wie sie ist. Es ist der klare Sieger hier.
a.GetValueOrDefault(0)
ist eine etwas effizientere Version von If(a, 0)
a.GetValueOrDefault()
ist eine etwas effizientere Version von a.GetValueOrDefault(0)
Natürlich gilt dies nur für numerische Typen.