01-10-12, 06:17 PM
كاتب الموضوع : 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)
يمكنك التصريح عن متغيرات أو خصائص أو حتى مصفوفات أو إجراءات من 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
كما يمكن ضبط قيمة المتغير من النوع nullable type بالطريقة الاعتيادية كما في المثال التالي الذي يضبط قيمة للمتغير numberOfChildren الذي تم التصريح عنه في المثال السابق
كود :
numberOfChildren = 2
كود :
numberOfChildren = Nothing
للحصول على القيمة المخزنة في متغير من النوع 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
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
كود :
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
Expression is not true
Expression is not false
لاحظ ان AndAlso و OrElse اللتين تستخدمان التقييم المختصر تقومان بتقييم معاملهما الثاني في حالة كون التعبير الأول قد تم تقييم قيمته إلى NothingExpression is not false
إن كان كلا أو أحد المعاملات في معادلة رياضية أو منطقية أو إزاحة 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)
كود :
' 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)