الحماية من القيم الفارغة
التحقق والأنماط
الحماية من القيم الفارغة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
لماذا نتحقق من null؟
غالبًا ما يتعطل الأسلوب الذي يستقبل قيمة null غير متوقعة لاحقًا بسبب NullReferenceException مربك في عمق مكدس الاستدعاءات.
يعني التحقق الوقائي فحص الوسائط مسبقًا والفشل بوضوح، بحيث يشير الخطأ مباشرةً إلى السبب الحقيقي.
التحقق التقليدي من null
أبسط أساليب الحماية هو إجراء فحص صريح يطرح ArgumentNullException عندما تكون الوسيطة المطلوبة null.
يتحقق هذا من صحة الإدخال عند حدود الأسلوب، قبل بدء أي عمل.
void Save(string path)
{
if (path == null)
throw new System.ArgumentNullException(nameof(path));
System.Console.WriteLine(path);
}استخدام nameof
مرّروا nameof(path) بدلًا من سلسلة نصية مكتوبة مباشرة. وسيعرض الاستثناء عندئذٍ اسم الوسيطة الدقيق، كما سيظل صحيحًا إذا أعدتم تسمية الوسيطة.
وهذا يجعل تصحيح الأخطاء أسهل بكثير عند تسجيل الاستثناء.
void Greet(string user)
{
if (user is null)
throw new System.ArgumentNullException(nameof(user));
System.Console.WriteLine("Hi " + user);
}المساعد ThrowIfNull
توفر C# الحديثة ArgumentNullException.ThrowIfNull(arg). إذ يتحقق من null ويطرح استثناءً يتضمن اسم الوسيطة الصحيح تلقائيًا.
وهو أسلوب مختصر ومفضل للتحقق الوقائي في شيفرة .NET الحالية.
void Process(object data)
{
System.ArgumentNullException.ThrowIfNull(data);
System.Console.WriteLine("Processing");
}تحقق وقائي قابل للتشغيل
يوضح هذا البرنامج عملية تحقق وقائي تلتقط وسيطة null وتبلغ عنها بوضوح بدلًا من التسبب في تعطل لاحق.
شغّلوه لرؤية رسالة الاستثناء التي تسمي الوسيطة غير الصالحة.
using System;
class Program
{
static void Print(string text)
{
ArgumentNullException.ThrowIfNull(text);
Console.WriteLine(text);
}
static void Main()
{
try { Print(null); }
catch (ArgumentNullException ex) { Console.WriteLine(ex.ParamName); }
}
}التحقق الوقائي باستخدام ?? throw
يمكنكم الجمع بين الإسناد والتحقق الوقائي باستخدام ?? مع throw. حيث يتحقق هذا الأسلوب من القيمة ويخزنها في سطر واحد.
ويُعد هذا نمطًا شائعًا في البناة عند الإسناد إلى حقل.
class Service
{
private readonly string _name;
public Service(string name)
=> _name = name ?? throw new System.ArgumentNullException(nameof(name));
}القيمة الفارغة مقابل null
بالنسبة إلى السلاسل النصية، تمثل القيمة null والقيمة الفارغة مشكلتين مختلفتين. استخدموا string.IsNullOrEmpty أو string.IsNullOrWhiteSpace لاكتشاف كلتيهما معًا.
يُعد ArgumentException، وليس ArgumentNullException، مناسبًا لقيمة فارغة لكنها ليست null.
void SetName(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new System.ArgumentException("Name required", nameof(name));
}التحقق الوقائي باستخدام الأنماط
تتسم أنماط is null وis not null بالوضوح، ولا يمكن خداعها بواسطة عوامل المساواة التي أعيد تحميلها.
فضّلوا is null على == null عندما يكون من المحتمل أن يعيد النوع تعريف ==.
object value = null;
if (value is null)
System.Console.WriteLine("It is null");
if (value is not null)
System.Console.WriteLine("Has value");استخدام قيمة افتراضية بدلًا من طرح استثناء
ليست كل قيمة null خطأً. ففي بعض الأحيان تكون القيمة الافتراضية المعقولة أفضل من طرح استثناء.
استخدموا ?? عندما تكون null مقبولة، ولا تطرحوا استثناءً إلا عندما تكون القيمة مطلوبة فعلًا.
string BuildPath(string folder)
{
folder ??= "/tmp";
return folder + "/file.txt";
}تساعد الأنواع المرجعية القابلة لـ null
عند تفعيل الأنواع المرجعية القابلة لـ null، يحذركم المترجم عندما تحاولون استخدام قيمة قد تكون null، مما يساعد على اكتشاف الأخطاء قبل التشغيل.
يوضح التصريح عن string، أي غير القابل لـ null، مقابل string?، أي القابل لـ null، مقصدكم ويوجه أداة التحليل.
#nullable enable
string required = "ok";
string? optional = null;
System.Console.WriteLine(optional?.Length ?? 0);تحققوا أولًا ثم استخدموا بأمان
بعد إجراء التحقق الوقائي في بداية الأسلوب، يمكن لبقية جسمه استخدام القيمة دون تكرار فحوصات null.
يُجري هذا البرنامج التحقق الوقائي أولًا، ثم يستخدم الوسيطة بثقة.
using System;
class Program
{
static int Length(string s)
{
ArgumentNullException.ThrowIfNull(s);
return s.Length;
}
static void Main()
{
Console.WriteLine(Length("hello"));
}
}اختبار سريع
اختبروا مدى فهمكم للتحقق الوقائي من null.
مراجعة
تحققوا من الوسائط المطلوبة في بداية الأسلوب. استخدموا ArgumentNullException.ThrowIfNull أو ?? throw مع nameof للحصول على أخطاء واضحة.
استخدموا string.IsNullOrWhiteSpace مع السلاسل الفارغة، وأنماط is null لإجراء فحوصات آمنة، و?? عندما تكون القيمة الافتراضية مقبولة بدلًا من الفشل.
الأسئلة الشائعة
هل درس «الحماية من القيم الفارغة» مجاني؟
نعم — نص درس «الحماية من القيم الفارغة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «الحماية من القيم الفارغة»؟
التحقق والأنماط تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «الحماية من القيم الفارغة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أنواع القيم القابلة للقيمة الفارغة
- العامل Null-Conditional
- عوامل Null-Coalescing
- الحماية من القيم الفارغة