C# / دليل حلول تحريري
حل NullReferenceException وتحذيرات nullable
استعد عقد إنشاء الكائن وغيابه بدلا من كبت التحذير عند فك المرجع لاحقا.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
يرمي برنامج محلي System.NullReferenceException عند الوصول إلى عضو، أو تبلغ الترجمة CS8602 لاحتمال فك مرجع null. قد تزيل ! التحذير مع بقاء فشل التشغيل. يحدد المكدس موضع الوصول، لكن القيمة الغائبة ربما بدأت قبل ذلك أثناء الإنشاء أو البحث أو فك البيانات.
افهم الأسباب المحتملة
- تقود تعليقات المراجع nullable التحليل عند الترجمة؛ ولا تنشئ كائنات ولا تجعل string? نوع مرجع تشغيل مختلفا. قد تخرق الشيفرة القديمة والبيانات الخارجية وعناصر المصفوفة الافتراضية ومسارات المنشئ والتعليقات الخاطئة عقد عدم null. ويختلف إصلاح الغياب الاختياري عن الحالة المطلوبة المفقودة.
1. تحديد القيمة الغائبة بدقة
احفظ أول إطار تطبيق مناسب واختزل الفشل إلى مدخل محلي اصطناعي. افصل سلسلة الوصول الطويلة إلى قيم مسماة لإظهار المستقبل null، ثم تتبع إسناده ونتيجة إنشائه أو بحثه. لا تفترض أن اسم الخاصية الأخير هو السبب، ولا تستبدل كل وصول بـ?. قبل تحديد معنى الغياب.
2. التعامل مع تحليل null كدليل عقد
تأكد من تفعيل Nullable وافحص التحذير عند أول إسناد غير متسق. تخبر ! اللاحقة المترجم بالثقة في ادعاء ولا تضيف حارسا أثناء التشغيل. يبقى المقتطف غير الصالح عمدا التالي غير قابل للتشغيل ولا يملك خرج نجاح موعودا. أصلح مصدر الكائن المفقود أو صرح باختياريته.
string? name = null;
Console.WriteLine(name!.Length);
يخرق المقتطف شرط فك المرجع عمدا ولا يشغل كمثال صالح.
3. فصل العرض الاختياري من المدخل المطلوب
يمنح المثال الكامل قيمة عرض اختيارية بديلا موثقا ويتحقق من الاسم المطلوب بحارس. يرفض الحارس الفراغ والغياب قبل Trim، ويفهم المترجم حالة عدم null الناتجة. يلائم البديل الحقل الاختياري المعلن فقط؛ أما الاعتماد المطلوب الغائب فينبغي أن يفشل إنشاؤه لا أن يختفي بصمت.
using System;
string? optional = null;
Console.WriteLine($"optional={optional?.Trim() ?? "unknown"}");
Console.WriteLine($"required={RequireName(" Ada ")}");
static string RequireName(string? text)
{
if (string.IsNullOrWhiteSpace(text)) throw new ArgumentException("name required", nameof(text));
return text.Trim();
}
optional=unknown
required=Ada
يطبع الاختياري unknown ويزال الفراغ من المطلوب ليصبح Ada.
4. إصلاح المنشئات والحدود الخارجية
هيئ الأعضاء المطلوبة في كل مسار إنشاء ناجح وافحص المفكوك قبل استخدام المجال. تحتوي مصفوفة string الجديدة مراجع null حتى ملئها رغم تعليق عناصرها. إذا وعدت Try بخرج غير خال عند النجاح فاستخدم عقدا دقيقا وصفات nullable مناسبة، لا تعليقا مضللا أو كبتا عاما.
تحقق من نجاح الإصلاح
ترجم مع تحليل nullable وافحص حل التحذير دون إضافة !. يجب أن يطبع المثال optional=unknown وrequired=Ada. اختبر الغائب والفارغ والصالح وnull المفكوكة والمصفوفة الافتراضية وفق العقد. تحقق من النتيجة أو الرفض المقصود، لا مجرد غياب الاستثناء في تشغيل واحد.
امنع تكرار المشكلة
- أثبت المطلوب عند الإنشاء وصرح بالاختياري بصدق وراجع كل ! وفق ثابت ملموس. احتفظ بفحص التحذيرات واختبر الحدود القديمة والخارجية. لا تحول كل غياب إلى كائن أو نص فارغ إلا إذا نص المجال على ذلك.