• 0
samerselo

Nullable Value Types

سؤال

في بعض الأحيان نتعامل مع قيمة ذات نوع ولكنها قد لا تملك قيمة محددة في حالات معينة فحقل في قاعدة بيانات مثلا يمكن تمييزه بين أن له قيمة ذات معنى أو أن ليس له قيمة أبدا. عندها يمكننا توسيع أنواع القيم لتأخذ إما قيما عادية أو قيم لا شئ 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 المولد من قبل المصمم يدعمها

تم تعديل بواسطه محمد سامر أبو سلو
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

1 إجابات على هذا السؤال .

  • 0

بسم الله الرحمن الرحيم

درس اكثر من رائع، حيث كانت تواجهني مشكلة null في الكلاس حيث كان لا يقبل ان تكون قمية الخاصية null

الف شكر لك

تم تعديل بواسطه abetry
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .