العامل Null-Conditional
وصول آمن باستخدام ?.
العامل Null-Conditional درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
مشكلة سلاسل null
يؤدي الوصول إلى عضو في مرجع قيمته null إلى طرح NullReferenceException. ويُعد هذا من أكثر أسباب تعطل البرامج شيوعًا أثناء التشغيل في C#.
عند تسلسل الاستدعاءات مثل user.Address.City، قد تكون أي وصلة في السلسلة بقيمة null، وكان الحل القديم هو كتابة سلسلة طويلة من فحوصات if.
التعرّف على ?.
يوقف عامل الوصول الشرطي إلى null ?. تقييم التعبير بأكمله عند الحاجة. فإذا كان الطرف الأيسر null، تكون النتيجة null بدلًا من طرح استثناء.
يمكن فهمه هكذا: «الوصول إلى هذا العضو، ولكن فقط إذا لم يكن الكائن null».
string name = null;
int? length = name?.Length;
System.Console.WriteLine(length == null);تصبح النتيجة قابلة لـ null
بما أن ?. قد ينتج القيمة null، يصبح نوع النتيجة قابلًا لـ null. فالتعبير name?.Length من النوع int? وليس int.
ولهذا السبب تخزنون النتيجة في int? بدلًا من int عادي.
string text = "hello";
int? len = text?.Length;
System.Console.WriteLine(len);مثال قابل للتشغيل
يوضح هذا البرنامج أن ?. يعيد قيمة عندما يكون الكائن موجودًا، ويعيد null عندما لا يكون موجودًا.
شغّلوه ولاحظوا أنه لا يُطرح أي استثناء على الإطلاق.
using System;
class Program
{
static void Main()
{
string a = "world";
string b = null;
Console.WriteLine(a?.ToUpper());
Console.WriteLine(b?.ToUpper() ?? "(null)");
}
}تسلسل عدة عوامل ?.
يمكنكم تسلسل ?. عبر عدة أعضاء. وبمجرد أن تصبح أي قيمة في السلسلة null، تتوقف السلسلة بأكملها وتعيد null.
لذلك يكون customer?.Order?.Total آمنًا حتى إذا كان customer أو Order بقيمة null.
string s = null;
int? upperLen = s?.ToUpper()?.Length;
System.Console.WriteLine(upperLen == null);المفهرس الشرطي لـ null ?[]
يوجد شكل مفهرس هو ?[] للمصفوفات والقوائم. فإذا كانت المجموعة null، يعيد الوصول إلى الفهرس القيمة null بدلًا من التسبب في تعطل البرنامج.
ملاحظة: يحمي هذا العامل من كون المجموعة null، لكنه لا يحمي من تجاوز حدود الفهرس.
int[] data = null;
int? first = data?[0];
System.Console.WriteLine(first == null);استدعاء الأساليب بأمان
يحمي ?. استدعاءات الأساليب أيضًا. إذ يستدعي list?.Clear() الأسلوب Clear فقط إذا لم تكن list بقيمة null؛ وإلا فلا ينفذ أي شيء.
إذا كان الأسلوب يعيد void، تصبح العبارة بأكملها ببساطة بلا تأثير عندما تكون القيمة null.
System.Collections.Generic.List<int> list = null;
list?.Add(5);
System.Console.WriteLine("No crash");إطلاق الأحداث بأمان تجاه التزامن
من الاستخدامات التقليدية لذلك إطلاق الأحداث. يطلق SomeEvent?.Invoke(this, args) الحدث بأمان فقط عند اشتراك معالج واحد على الأقل.
وقد حل هذا محل نمط التحقق القديم من null، الذي كان يمكن أن تحدث فيه حالة تسابق بين التحقق والاستدعاء.
System.Action handler = null;
handler?.Invoke();
System.Console.WriteLine("Invoked safely");الجمع بين ?. و??
يتكامل ?. طبيعيًا مع عامل دمج null ?? لتوفير قيمة احتياطية عندما تكون السلسلة null.
يعيد name?.Length ?? 0 الطول، أو 0 إذا كانت name بقيمة null.
string name = null;
int length = name?.Length ?? 0;
System.Console.WriteLine(length);تفصيل دقيق ينبغي الانتباه إليه
حتى عندما يكون نوع القيمة النهائية غير قابل لـ null، فإن استخدام ?. يجعل التعبير قابلًا لـ null. فالتعبير list?.Count من النوع int? وليس int.
إذا كنتم بحاجة إلى int عادي، فأضيفوا بعده ?? 0 أو استخدموا GetValueOrDefault().
var list = new System.Collections.Generic.List<int> { 1, 2 };
int count = list?.Count ?? 0;
System.Console.WriteLine(count);مقارنة كاملة
يقارن هذا البرنامج بين أسلوب if المطوّل وإصدار ?. المختصر. كلاهما يتجنب الاستثناء، لكن ?. أكثر وضوحًا ونظافة بكثير.
using System;
class Program
{
static void Main()
{
string s = null;
int len = s != null ? s.Length : -1;
Console.WriteLine(len);
Console.WriteLine(s?.Length ?? -1);
}
}اختبار سريع
اختبروا مدى فهمكم لعامل الوصول الشرطي إلى null.
مراجعة
يوقف عامل الوصول الشرطي إلى null ?.، وكذلك المفهرس ?[]، الوصول إلى العضو عندما يكون الكائن null، ويعيد null بدلًا من طرح استثناء.
تصبح النتيجة قابلة لـ null، لذلك ادمجوا هذا العامل مع ?? لتوفير قيمة احتياطية.
الأسئلة الشائعة
هل درس «العامل Null-Conditional» مجاني؟
نعم — نص درس «العامل Null-Conditional» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «العامل Null-Conditional»؟
وصول آمن باستخدام ?. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «العامل Null-Conditional»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أنواع القيم القابلة للقيمة الفارغة
- العامل Null-Conditional
- عوامل Null-Coalescing
- الحماية من القيم الفارغة