ما هو NullReferenceException وكيفية التعامل معه؟ دليل شامل لمطور C#
\n\nهل سبق لك أن رأيت هذه الرسالة المخيفة: "Object reference not set to an instance of an object"؟ إذا كنت تكتب بلغة C# لمدة أسبوع على الأقل، فمن المؤكد أنك واجهتها. هذا هو NullReferenceException - الخطأ الأكثر شيوعًا في عالم .NET. إنه يخيف المبتدئين، لكن المطورين ذوي الخبرة يعرفون: إنها مجرد طريقة من البرنامج ليقول "لا أعرف بماذا أعمل، أعطني كائنًا".
\n\nفي هذه المقالة، سنشرح لماذا يحدث NullReferenceException، وكيفية العثور عليه، والأهم من ذلك، كيفية منعه. ستتعلم كتابة كود أكثر أمانًا وقضاء وقت أقل في التصحيح.
\n\nما هو NullReferenceException بكلمات بسيطة؟
\n\nتخيل أنك طلبت بيتزا، وجاء الساعي خالي اليدين. تسأل: "أين البيتزا؟"، فيجيب: "لا أعرف، ليس لدي شيء". تقريبًا بنفس الطريقة يعمل NullReferenceException. تحاول استدعاء دالة أو الوصول إلى خاصية لمتغير يساوي null. المترجم لا يرى ذلك، لكن أثناء التنفيذ يتعطل البرنامج.
في C#، أي متغير مرجعي (فئة، واجهة، سلسلة، مصفوفة) يمكن أن يكون null. إذا حاولت فعل شيء بهذا المتغير، ستحصل على استثناء.
أكثر السيناريوهات شيوعًا لحدوث NullReferenceException
\n\nلنلقِ نظرة على أمثلة كود حقيقية تؤدي إلى هذا الخطأ.
\n\n1. متغير غير مهيأ
\nstring name;\nConsole.WriteLine(name.Length); // NullReferenceException\nالمتغير name تم تعريفه ولكن لم تتم تهيئته. افتراضيًا يساوي null.
2. دالة تُرجع null
\npublic string GetUserName(int id)\n{\n // إذا لم يتم العثور على المستخدم، نُرجع null\n return null;\n}\n\nvar user = GetUserName(42);\nConsole.WriteLine(user.ToUpper()); // NullReferenceException\n\n3. الوصول إلى عنصر غير موجود في مجموعة
\nvar list = new List<string> { "A", "B" };\nvar item = list[5]; // ArgumentOutOfRangeException، لكن لو كان العنصر null...\n// وهنا مثال مع Dictionary:\nvar dict = new Dictionary<int, string>();\nvar value = dict[1]; // KeyNotFoundException، لكن لو كان المفتاح موجودًا والقيمة null؟\n\n4. سلسلة من الاستدعاءات
\nclass Address { public string City { get; set; } }\nclass Person { public Address Address { get; set; }\n\nvar person = new Person();\nConsole.WriteLine(person.Address.City); // NullReferenceException، لأن Address == null\n\nكيفية العثور على NullReferenceException: تصحيح الأخطاء للمبتدئين
\n\nعندما يتعطل البرنامج، سيعرض Visual Studio أو Rider مكدس الاستدعاءات. سيكون هناك سطر يوضح مكان حدوث الخطأ. لكن غالبًا ما تكون المشكلة أعمق. إليك خوارزمية البحث:
\n\n- \n
- انظر إلى السطر الذي به الخطأ. أي متغير يُستخدم هناك؟ هل هو بالتأكيد ليس null؟ \n
- تحقق من مصدر القيمة. إذا كانت نتيجة دالة - تحقق مما إذا كانت يمكن أن تُرجع null. \n
- استخدم نقاط التوقف. ضع breakpoint قبل السطر الذي به الخطأ وتحقق من قيم جميع المتغيرات. \n
- أضف نقاط توقف شرطية. في Visual Studio يمكنك وضع breakpoint بشرط:
myVar == null. \n
كيفية إصلاح NullReferenceException: 5 طرق مجربة
\n\nالخبر السار: NullReferenceException يمكن دائمًا منعه تقريبًا. إليك ما يمكنك فعله.
\n\n1. التحقق من null (if القديم الجيد)
\nif (name != null)\n{\n Console.WriteLine(name.Length);\n}\nelse\n{\n Console.WriteLine("الاسم غير محدد");\n}\nهذا يعمل، لكنه يجعل الكود ضخمًا إذا كان هناك العديد من التحققات