قيمة null هي من أكثر الأمور التي يجب الانتباه لها أثناء كتابة الكود البرمجي لأن الخطأ فيها يسبب مشاكل كثيرة ولها تاريخ من الكوارث.

ماذا يعني أن يكون المتغير في حالة نل ؟

عند تعريف اي متغير وإسناد قيمة معينة له فإن هذا المتغير يشير الى موقع هذه القيمة في الذاكرة لكن ماذا لو أنشأنا هذا المتغير ولم نسند له قيمة ؟

في هذه الحالة تكون قيمته نل أي لا يشير إلى شيء

 لغة دارت في إصداراتها الاخيرة تدعم ميزة ال null safety اي الاحماية من النل.

لقد اعتدنا قبل وجود ال null safety ان كل نوع نوع متغير يمكن أن يحوي قيمة أو أن يكون نل

مثلا إذا عرفنا متغير على أنه من نوع int فيمكن أن تكون قيمته رقم مثل 1,5,-134,0 او ان تكون قيمته نل

الان عند تحديث لغة دارت اصبحت non nullable type by default واختصارها NNBD أو بالعربية الحماية الافتراضية من نل اي انها افتراضيا لا تسمح بوجود نل- الا اذا اردنا ذلك -

اذاً ماذا يعني ان يكون نوع المتغيرnon nullable type او بالعربية نوع غير قابل للنل ؟

الان -في اصدارات لغة دارت الاخيرة -عند تعريف اي متغير يطلق على نوع المتغير على انه non nullable type اي لا يسمح بان تكون قيمته نل ,وفي حالة قمنا بإسناد قيمة نل له سوف تظهر لنا رسالة خطأ

وعندما ذكرنا "تظهر لنا رسالة خطأ " هنا تبرز لنا ميزة اخرى موجودة في لغة دارت وهي أن هذه اللغة تدعم ال "sound null safety"

 ماذا يعني sound ؟

لغة دارت من اللغات القلة التي تدعم هذه الخاصية وهي أننا عندما نسند نل الى نوع متغير لا يسمح به او ما يسمى non nullable type هنا يضهر الخطا اثناء كتابة الكود ولا يسمح بتنفيذ الكود الا عند تصحيح الخطأ وهي نقطة لصالح هذه اللغة مقارنة باللغات الاخرى التي لا تدعم هذه الميزة فلا تظهر رسالة خطأ عند استناد نل وبالتالي يظهر الخطأ عند تنفيذ الكود وهو شيء لا نتمنى حدوثه

أي أن لغة دارت تحميك من إسناد قيمة نل إلى أي نوع متغير قمت بتعريفه على أنه قيمة لا تقبل نل او non nullable type

العلامة (?)

الآن يتبادر في ذهننا سؤال وهو :ماذا لو اردنا ان يحتوي المتغير على قيمة نل ؟

مثلا نريد ان يكون المتغير من نوع int يحوي قيم مثل 6,7,0,-8 او يحوي على قيمة نل ماذا نفعل؟

في هذه الحالة نعرف نوع المتغير بجواره علامة استفهام

في هذه الحالة إذا اسندنا قيمة نل للمتغير لا تظهر رسالة خطأ

ايضا اذا لم نعطي قيمة أولية للمتغير لا تظهر رسالة خطأ وتكون قيمة المتغير نل

العلامة (.?)

في حال كانت لدينا قيمة من نوع قابل ل نل nullable type ونحن متأكدين من أنها لا يمكن أن تكون نل عندها يمكن نضع في نهايتها العلامة ! لجعل لغة دارت تعاملها معاملة نوع non nullable type 

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

لكن في حالة اننا متاكدين ان القيمة لا يمكن أن تكون نل يمكن إلحاقها بعلامة !

لكن يجب الحذر عند استخدام هذه العلامة وأن نتأكد أن القيمة لا يمكن أن تكون نل وإلا سوف يظهر الخطا اثناء تشغيل البرنامج

العلامة (??)

في حالة انني تعاملت مع متغير يقبل قيمة نل nullable type واردت ان افحص هذا العنصر ما إذا كانت قيمته نل أسند له قيمة معينة

في هذا المثال المتغير "greeting" كانت قيمته نل لأننا لم نسند له قيمة عند انشاءه .في السطر السادس يعني " إذا كانت قيمة المتغير greeting هي نل أسند لها القيمة Hi"

العلامة (.?)

في حالة انني تعاملت مع متغير يقبل قيمة نل nullable type او دالة ترجع نوع قابل ل نل واردت ان اتعامل مع خاصية لهذا المتغير أو الدالة يجب في البداية يجب في ان اضع علامة( .?) قبل ان اكتب الخاصية وتعني إذا لم تكن القيمة نل اعمل نفذ هذه الخاصية

الخطأ في هذا الكود اننا نريد ان نصل الى خاصية داخل المتغير وهي length بالرغم من ان 

المتغير يمكن ان يكون نل هنا في هذا المثال نحن نريد ان نعرف عدد أحرف النص بالرغم من انه ممكن ان يكون غير موجود

الحل هو استخدام علامة(.?) بعد المتغير

(late)

عند تعريف اي متغير على أنه لا يقبل قيمة نل non nullable type يجب أن نسند له قيمة ابتدائية والا سوف يظهر لنا خطأ أثناء الكتابة لا يسمح لنا بتنفيذ البرنامج

لكن ماذا لو اننا نريد ان نسند القيمة لاحقا هنا يمكن استخدام "late" والاخيرة تخبر الكومبايلر أن لا ينظر إلى قيمة المتغير إلا عندما يتم استخدامه فلا يعترض على عدم إسناد قيمة أولية

لكن يجب الى اسناد قيمة قبل استخدام المتغير والا ظهر لنا خطأ اثناء تشغيل البرنامج

(required)

عند عمل دالة او كلاس تحتوي على متغير مسمى Named Parameter- وهو متغير نستدعيه باسمه-فان اعطاء قيمة له عند الاستدعاء تكون اختيارية في الوضع الافتراضي اي اننا ممكن ان نستدعي الدالة من دون إعطاء قيم لبعض المتغيرات المسماة وعندها تكون قيمتها نل مما يعني اننا يجب ان نعرّف نوع المتغير على انه قابل للنل nullable type

لكن ماذا لو اردنا ان يكون المتغير غير قابل ل نل non-nullable ؟ عندها يظهر لنا خطأ

أي أننا لا يمكن أن نستدعي دالة من دون أن نلزم اعطاء قيم لجميع المتغيرات المسماة او ال Named Parameter لان هذه المتغيرات لا تقبل قيمة نل وهذه الإلزام يتحقق عند كتابة كلمة required قبل المتغير ففي هذه الحالة لا يمكن استدعاء الدالة من دون إعطاء قيمة للمتغير