تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Nullable Value Types في VB2008
#1
منقول من المنتدى القديم
الكاتب samerselo
-- بحثت ولم اجد الموضوع قد نقل من قبل--

في بعض الأحيان نتعامل مع قيمة ذات نوع ولكنها قد لا تملك قيمة محددة في حالات معينة فحقل في قاعدة بيانات مثلا يمكن تمييزه بين أن له قيمة ذات معنى أو أن ليس له قيمة أبدا. عندها يمكننا توسيع أنواع القيم لتأخذ إما قيما عادية أو قيم لا شئ null Value وهذا التوسيع يدعى nullable type.
كل nullable type يتم إنشاؤه من التركيب Nullable(T). ففي المثال التالي يتم التصريح عن متغير يحمل النوع Nullable Boolean Type كما يلي
كود :
Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

فالمتغير ridesBusToWork يمكن أن يحمل القيمة True أو القيمة False أو أن لا يحمل أي قيمة إطلاقا وتكون القيمة الافتراضية له هي أنه لا يحمل أي قيمة وفي هذه الحالة قد يعني أنه لم يتم الحصول على تلك المعلومة من ذلك الشخص وفي المقابل القيمة False قد تعني أن الشخص لا يركب الباص للعمل.
يمكنك التصريح عن متغيرات أو خصائص أو حتى مصفوفات أو إجراءات من nullable types كما يمكنك إعادة Nullable type من وظيفة ما. ولكن لا يمكنك إنشاء nullable type من نوع مرجعي Reference type مثل المصفوفات أو الفئات أو String فالنوع الأساسي يجب أن يكون نوع بالقيمة Value type

تعتبر الخصائص HasValue و Value هي العناصر الأكثر أهمية في nullable type فمن أجل متغير من النوع nullable type تخبرنا الخاصية HasValue فيما إذا كان للمتغير قيمة محددة أم لا فإن كانت قيمة تلك الخاصية True عندها يمكنك قراءة قيمة المغير من الخاصية Value ويجب عليك الانتباه إلى أن كلتا الخاصيتين HasValue و Value هما خاصيتين للقراءة فقط.
عندما تصرح عن متغير من النوع nullable type تكون القيمة الافتراضية للخاصية HasValue هي False وهذا يعني أن المتغير في الحالة الافتراضية لا يحمل أي قيمة محددة عوضا عن القيمة الافتراضية لنوع القيمة المؤسس لهذا النوع ففي المثال التالي لا يكون للمتغير numberOfChildren قيمة محددة مع أن القيمة الافتراضية للنوع Integer هي الصفر
كود :
Dim numberOfChildren? As Integer

وتكون القيمة لا شئ Null Value مفيدة لتوضيح أن قيمة المتغير غير معروفة أو غير محددة فإن تم التصريح عن المتغير numberOfChildren على أنه Integer فلن يكون هناك قيمة تشير إلى أنه لم يتم توفير المعلومات المطلوبة بعد
كما يمكن ضبط قيمة المتغير من النوع nullable type بالطريقة الاعتيادية كما في المثال التالي الذي يضبط قيمة للمتغير numberOfChildren الذي تم التصريح عنه في المثال السابق

كود :
numberOfChildren = 2

وإن كانت لمتغير أو خاصية من النوع nullable type قيمة محددة يمكنك إعادتها للقيمة الأساسية بعدم احتوائها على قيمة وذلك بضبطها إلى Nothing كما في المثال

كود :
numberOfChildren = Nothing

مع انه يمكنك ضبط القيمة Nothing للمتغير من النوع Nullable type إلا أنه لا يمكنك فحصه بالمقارنة مع Nothing باستخدام علامة المساواة وتكون قيمة المقارنة التي تستخدم علامة المساواة مثل someVar = Nothing دائما مساوية لـ Nothing. بدلا عن ذلك يمكنك فحص قيمة الخاصية hasValue من اجل القيمة False أو باستخدام المعامل Is أو المعامل IsNot
للحصول على القيمة المخزنة في متغير من النوع nullable type يجب عليك أولا فحص الخاصية HasValue للتأكد من أنها تحمل قيمة فإن حاولت قراءة قيمة ذلك المتغير وكانت قيمة خاصيته HasValue مساوية لـ False سوف يقوم فيجول بايزيك بإطلاق استثناء InvalidOperationException ويرينا المثال التالي الطريقة المنصوح بها لقراءة قيمة المتغير numberOfChildren الخاصة بالمثال السابق
كود :
If numberOfChildren.HasValue Then
    MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
    MsgBox("It is not known how many children there are.")
End If

عندما يتم استخدام متغيرات من النوع Nullable Boolean في التعابير المنطقية يمكن أن تكون القيمة True أو False أو Nothing وفيما يلي جدول الحقيقة من أجل And و Or بما أن b1 و b2 يملكان ثلاثة قيم محتملة يكون هناك تسعة احتمالات للمقارنة

b1 b2 b1 And b2 b1 Or b2
Nothing Nothing Nothing Nothing
Nothing True Nothing True
Nothing False False Nothing
True Nothing Nothing True
True True True True
True False False True
False Nothing False Nothing
False True False True
False False False False
عندما تكون قيمة المتغير المنطقي أو التعبير Nothing فالقيمة هي ليست True و ليست False أيضا انظر للمثال التالي

كود :
Dim b1? As Boolean
Dim b2? As Boolean
b1 = True
b2 = Nothing

' The following If statement displays "Expression is not true".
If (b1 And b2) Then
    Console.WriteLine("Expression is true")
Else
    Console.WriteLine("Expression is not true")
End If

' The following If statement displays "Expression is not false".
If Not (b1 And b2) Then
    Console.WriteLine("Expression is false")
Else
    Console.WriteLine("Expression is not false")
End If


ففي هذا المثال تقيم b1 And b2 إلى Nothing وبالنتيجة يتم تنفيذ قسم Else في كلا تعبير If ويكون الخرج كما يلي
Expression is not true
Expression is not false
لاحظ ان AndAlso و OrElse اللتين تستخدمان التقييم المختصر تقومان بتقييم معاملهما الثاني في حالة كون التعبير الأول قد تم تقييم قيمته إلى Nothing
إن كان كلا أو أحد المعاملات في معادلة رياضية أو منطقية أو إزاحة nullable فستكون النتيجة أيضا nullable وإن كان لكلا المعاملين قيمة لا تساوي Nothing تتم العملية وفق قيم تلك المعاملات كما لو أنهما من نوع قيمة وليس nullable ففي المثال التالي المتغير compare1 والمتغير sum1 نوعان ضمنيان فإن أوقفت مشيرة الفأرة قليلا فوقهما ستلاحظ أن المترجم يشير إلى أن كلاهما من nullable type

كود :
'Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2

' The comparison evaluated is 3>2, but compare1 is inferred to be of
' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True
Console.WriteLine(m & " * " & n & " * " & sum1 & " * " & compare1)

وإن كانت قيمة واحد أو أكثر من المعاملات Nothing فالنتيجة ستكون Nothing
كود :
' Change the value of n to Nothing.
n = Nothing

Dim compare2 = m > n
Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays 3 * * *
Console.WriteLine(m & " * " & n & " * " & sum2 & " * " & compare2)
تشكل قواعد البيانات أكثر أماكن استخدام nullable types أهمية مع أن ليست جميع أغراض قواعد البيانات تدعم nullable types ولكن الـ TableAdapter المولد من قبل المصمم يدعمها
الرد }}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم