هل هناك أي فرق بين استخدام .getValueordefault (0) وإذا (متغير، 0) مع أنواع غير قابلة للناس؟

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

سؤال

هل هناك أي فرق بين الطريقة الثانية أدناه لحساب ج ... على وجه التحديد مشاكل الملاكمة / إلغاء الصندوق؟

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)
هل كانت مفيدة؟

المحلول

وفقا للعاكس، فإن IL من Snippet Snippet في:

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

عدل] ثم النظر في الوظائف المنعكسة GetValueOrDefault() و GetValueOrDefault(T defaultValue) يعطي ما يلي (على التوالي):

Public Function GetValueOrDefault() As T
    Return Me.value
End Function

و

Public Function GetValueOrDefault(ByVal defaultValue As T) As T
    If Not Me.HasValue Then
        Return defaultValue
    End If
    Return Me.value
End Function

يشير إلى أي شكل بفعالية بالضبط نفس الشيء

نصائح أخرى

يتم تجميع بيان C = إذا كان (A، 0) + إذا تم ترجمة العبارة (B، 0) إلى هذا:

  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

يتم جمع المقتطف الثاني تماما كما هو. إنه الفائز الواضح هنا.

a.GetValueOrDefault(0) هو نسخة أكثر كفاءة قليلا من If(a, 0)

a.GetValueOrDefault() هو نسخة أكثر كفاءة قليلا من a.GetValueOrDefault(0)

بالطبع، هذا صحيح فقط لأنواع رقمية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top