C'è qualche differenza tra l'utilizzo .GetValueOrDefault (0) e se (variabile, 0) con i tipi nullable?

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

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)
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top