Gibt es einen Unterschied zwischen der Verwendung von .GetValueOrDefault (0) und If (Variable, 0) mit Nullable-Typen?

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

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)
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top