C# / الأساسي: البرامج ذات الأنواع وعقود الكائنات / الدرس 2
الأنواع والتحويلات والسماح بالقيم الخالية
اختر التمثيل العددي والمرجعي عمدا واستخدم تحليل nullable لفحص العقد لا كسحر تشغيل.
في هذه الصفحة
أهداف الدرس
- تمييز أنواع القيم والمراجع وصيغ nullable.
- شرح التحويلات والتجاوز المفحوص.
- استخدام تحليل null ومعالجة الغياب الصريحة.
النوع يحدد العمليات والقيم الممثلة
لكل تعبير C# نوع ساكن يضبط العمليات. int عدد موقع من32بتا وdouble للحساب الثنائي العائم وdecimal للعشري وbool ليست حقيقة عددية. تطلب var استنتاج النوع الساكن ولا تجعل المتغير ديناميكيا. تظل المتغيرات المستنتجة بـvar مقيدة بنوعها طوال نطاقها؛ لا تقبل لاحقا قيمة عشوائية لمجرد غياب اسم النوع في التصريح.
اختر الأنواع من المجال ومديات الوسيط. قد يناسب decimal حسابا ماليا لكن التقريب والعملة يحتاجان سياسة. قد يضيق التحويل قيمة أو يقربها ولا يعد تحققا وحده. افحص الخارجي قبل اعتماد نتيجة مضيقة. قد يقع فقد المعلومات في نتيجة وسيطة قبل تخزينها؛ لذلك يجب تحليل نوع كل عملية لا نوع المتغير النهائي فقط.
التحويل يسبق العملية المعنية
تقتطع القسمة الصحيحة نحو الصفر ولا يستعيد تحويل الخارج إلى double كسره. يقارن المثال التحويل قبل القسمة وبعدها وينسق بثقافة ثابتة لتكرار الفاصل العشري. التنسيق عرض لا برهان على تمثيل كل كسر ثنائيا. إن حفظ double في متغير لا يغير بأثر رجعي نوع قسمة نفذت أولا على int؛ لهذا يهم موضع التحويل.
قد يلتف الحساب الصحيح غير المفحوص وفق قواعده ويكشف checked التجاوزات المناسبة. ولتعابير الثوابت قواعد ترجمة أيضا. قرر الرفض أوالتشبيع أوالالتفاف المقصود ولا تترك الإعداد يقرر معنى العمل. يجب أن يكون الرفض أو الالتفاف المقصود جزءا من العقد حتى لا يؤدي تغيير إعداد overflow إلى معنى مجال مختلف.
using System;
using System.Globalization;
int total = 7, people = 2;
double truncated = total / people;
double share = (double)total / people;
Console.WriteLine(truncated.ToString("F1", CultureInfo.InvariantCulture));
Console.WriteLine(share.ToString("F1", CultureInfo.InvariantCulture));
3.0
3.5
الأول ثلاثة قبل التحويل؛ ويحفظ تحويل المعامل أولا النصف.
تعبر المراجع nullable عن الغياب المقصود
مع تفعيل التحليل تعني string مرجعا مقصودا غير null وتسمح string? بالغياب. لهما نوع التنفيذ نفسه. يتتبع المترجم حالتي احتمال null وعدمه ويحذر من التعارض؛ ولا تضيف التعليقات فحص تشغيل تلقائيا ولا تمنع بيانات خارجية معيبة. تأتي التحذيرات من جمع التعليقات وتحليل التدفق وعقود المكتبة، ولا تعني أن التنفيذ استبدل كل وصول بحارس آلي.
تختلف أنواع القيم nullable: تمثل int? النوع Nullable<int> بعدد أوغياب. افحص HasValue أوالنمط قبل القيمة. وقد يبقى حقل مرجعي غير nullable خاليا أثناء التشغيل عند خرق الإنشاء أوالتكامل؛ فتحقق من الحدود المهمة. ينبغي أن يحافظ البناء والتكامل مع الشيفرة القديمة على الوعد نفسه؛ ليست صحة التعليق دليلا مستقلا على صحة البيانات.
اختيار سلوك الغياب للمجال
يعامل المثال الثاني التسمية الغائبة كنص unknown صريح. تقيم ?? يمينها عند null فقط. ويضيق فحص نمطي العدد الاختياري قبل قراءته. هذه سياسات مقصودة لا نصيحة لإخفاء كل null بافتراضي. يجب أن يكون النص البديل unknown معنى مقبولا للمستخدم، لا حيلة تسكت خطأ في إنشاء مكون مطلوب.
قد تجعل ?. سلسلة اختيارية تعيد null لكنها لا ينبغي أن تخفي اعتمادا مطلوبا غائبا. يكبت ! التحليل ولا ينشئ كائنا ولا يؤمن الفك. فضل إثبات الحالة بحارس أوإصلاح التهيئة. عندما تثبت عدم null بحارس، يصبح ما بعده قابلا للتفسير والمراجعة بدلا من ادعاء غير مرئي وراء علامة !.
using System;
string? label = null;
int? count = 3;
Console.WriteLine(label ?? "unknown");
if (count is int present)
{
Console.WriteLine($"count={present}");
}
unknown
count=3
تستخدم التسمية الغائبة بديلا موثقا ويوفر العدد nullable قيمته الموجودة.
التهيئة والتحليل مسؤوليتان مستمرتان
تأخذ الحقول وعناصر المصفوفة افتراضيات، ويجب إسناد المحلي يقينا قبل قراءته. قد تحتوي مصفوفة مراجع غير nullable عناصر null بداية؛ فلا تملؤها التعليقات بكائنات. يثبت المنشئ المطلوب ويبلغ المحلل فشل الصياغة والمدى بدل الاعتماد على تحويل. إسناد العناصر الافتراضية لا يساوي إنشاء كائن لكل عنصر، وهذه حالة مهمة لاختبارات الحاويات المرجعية.
استخدم TryParse للنص غير الصالح المتوقع ثم فحص المجال. حدد الثقافة للبروتوكول لا العرض المحلي فقط. اختبر الغياب والفراغ والمسافة والحد وخارجه. تكشف التحذيرات القصد وتثبت الاختبارات والحراس السلوك الملحوظ. يسمح فصل TryParse عن فحص المجال برسالة أدق ويحافظ على الحالة السابقة حتى نجاح جميع الشروط.
الأخطاء الشائعة وإصلاحها
تصبح الحصة الكسرية double صحيح القيمة.
- لماذا يحدث؟
- اكتملت القسمة الصحيحة قبل التحويل.
- كيف تصلحه؟
- حوّل المعامل أولا.
- كيف تتجنب تكراره؟
- تتبع نوع كل وسيط.
يزيل ! التحذير ويبقى الانهيار.
- لماذا يحدث؟
- اعتُبر الكبت فحص تشغيل.
- كيف تصلحه؟
- تحقق من الغياب أوهيئ المطلوب.
- كيف تتجنب تكراره؟
- راجع كل كبت ببرهان ملموس.
عنصر null رغم التعليق غير nullable.
- لماذا يحدث؟
- لم تنشئ التهيئة الافتراضية الكائنات.
- كيف تصلحه؟
- املأ العناصر أوصور الغياب صراحة.
- كيف تتجنب تكراره؟
- اختبر الإنشاء الافتراضي ومساراته.
اختبر فهمك
1. اشرح اختلاف النموذج التشغيلي لـstring? وint?.
اعرض الحل المشروح
تضيف string? قصد null ساكنا لمرجع عادي يقبلها؛ وتمثل int? قيمة Nullable<int> بحالة وجود وعدد عنده. يحتاج الاثنان سياسة غياب لكن الأخيرة تغير تمثيل نوع القيمة. لا تفترض منع التعليقات null القادمة من الخارجي أوالقديم.
2. صمم تحقق عدد نصي من صفر لمئة.
اعرض الحل المشروح
استخدم TryParse مناسبة وارفض الفشل وافحص المجال الشامل قبل تحديث الحالة. حدد الثقافة الثابتة للبروتوكول واحفظ الحالة عند الفشل وميز الصياغة عن المجال حيث يفيد. اختبر الصفر ومئة والسالب ومئة وواحدا وأرقاما طويلة.
أهم ما تعلمته
- تعبر الأنواع وتحليل null عن القصد دون إلغاء تحقق الحدود.
- تحدث التحويلات في موضع وقد تفقد المعلومات.
- يحتاج الغياب والمدخل الخاطئ والتجاوز سياسات صريحة.