المتابعون للمدونة

الأحد، 5 أكتوبر 2014

مقارنة Nothing وصفر



مقارنة Nothing وصفر!! 

هذا مثال على المشاكل التي قد تحدث بسبب تفعيل التحويل التلقائي بين الأنواع Implicit Conversion:

عند مقارنة كائن Object قيمته Nothing مع متغير قيمته صفر ستكون النتيجة True على عكس المتوقع جرب مثلا:

Dim Test As Object = Nothing

If Test = 0 Then MsgBox("Test = 0")

عند تشغيل هذا الكود، ستظهر الرسالة التي تخبرك بأن قيمة المتغير Test تساوي 0، مع أن قيمته هي Nothing!!

(هذا لا يحدث عند مقارنة Nothing مع أي رقم آخر غير الصفر، لأان التحويل التلقائي يحول الكائن إلى صفر)

ولحل هذه المشكلة، عليك إضافة شرط للتأكد أولا أن قيمة الكائن ليست Nothing:

If Test IsNot Nothing AndAlso Test = 0 Then

       MsgBox("Test = 0")

End If

أو يمكنك تحويل الكائن إلى عدد صحيح منعدم Nullable Integer ثم إجراء عملية المقارنة عليه:

Dim I = CType(Test, Integer?)

If I = 0 Then MsgBox("Test = 0")

أما لو أجريت عملية التحويل مباشرة في جملة الشرط، فعليك في هذه الحالة استخدام الوسيلة Equals بدلا من العلامة = وإلا فسيحدث نفس الخطأ:

If CType(Test, Integer?).Equals(0) Then

    MsgBox("Test = 0")

End If

ولا تسألوني لماذا يتصرف مترجم الكود بهذه الطريقة العجيبة.. سأرسل هذا الخطأ لميكروسوفت لأرى ماذا يقولون عنه!

 

ملحوظة:

لا يحدث خطأ مماثل في سي شارب، لأنها تمنع التحويل التلقائي، لهذا لا يمكنك أصلا أن تكتب:

object  Test = null;

if (Test == 0) MessageBox.Show("Test = 0");

لأن مترجم الكون سيرفض المقارنة Test == 0.

كذلك لو حولت الكائن إلى عدد صحيح منعدم، فلن يحدث خطأ في المقارنة ولن تظهر الرسالة:

object  Test = null;

if ((int?)Test == 0) MessageBox.Show("Test = 0");

 


ليست هناك تعليقات:

إرسال تعليق

صفحة الشاعر