العوامل Null-Conditional وNull-Coalescing
اجمعوا بين ?., ?[], ?? و??= لكتابة شيفرة موجزة وآمنة تجاه null دون فحوصات مطوّلة.
العوامل Null-Conditional وNull-Coalescing درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
أنماط التعليمات البرمجية الآمنة تجاه null
توفر C# ثلاثة عوامل مخصصة لمعالجة قيم null بإيجاز: العامل الشرطي المتعلق بـ null (?. و?[])، وعامل الدمج مع null (??)، وعامل الإسناد بالدمج مع null (??=). وتلغي هذه العوامل مجتمعةً معظم التعليمات النمطية المطولة للتحقق من null.
العامل الشرطي المتعلق بـ null: ?.
ينتقل ?. مباشرةً إلى null إذا كان الجانب الأيسر null بدلًا من إلقاء NullReferenceException. ويصبح نوع النتيجة قابلًا لـ null.
User? user = GetUser(id);
// Without ?.:
string? name = null;
if (user != null) name = user.Name;
// With ?.:
string? name2 = user?.Name;
// Chained:
string? city = user?.Address?.City;
// Method call:
string? upper = user?.Name?.ToUpper();العامل الشرطي المتعلق بـ null مع مفهرس: ?[]
يُعد ?[] عامل الفهرسة الشرطي المتعلق بـ null. ويتيح الوصول بأمان إلى عناصر المصفوفة أو المجموعة عندما يُحتمل أن تكون المجموعة نفسها null.
List<string>? tags = product?.Tags;
// Safe index access
string? firstTag = tags?[0];
// Null-conditional LINQ
int? count = tags?.Count;
bool? hasItems = tags?.Any();
// With methods:
string? joined = tags?.FirstOrDefault()?.ToUpper();عامل الدمج مع null: ??
يُرجع ?? المعامل الأيسر إذا لم يكن null، وإلا يُرجع المعامل الأيمن (القيمة البديلة). وهو البديل الموجز للتعبير x != null ? x : fallback.
string? name = GetName();
// Without ??:
string display = name != null ? name : "Anonymous";
// With ??:
string display2 = name ?? "Anonymous";
// Chaining ?? for multiple fallbacks:
string result = primary ?? secondary ?? tertiary ?? "Default";
// Combining with ?.
string city = user?.Address?.City ?? "Unknown City";التعيين باستخدام null-coalescing: ??=
يُسنِد ??= القيمة الموجودة على اليمين إلى المتغير فقط إذا كانت قيمته الحالية null. وهو مناسب جدًا لأنماط التهيئة الكسولة.
// Lazy initialization
private List<string>? _cache;
public List<string> GetCache()
{
_cache ??= new List<string>(); // only assigns if null
return _cache;
}
// Equivalent to:
// if (_cache is null) _cache = new List<string>();
// In-place:
string? name = null;
name ??= "Default";
Console.WriteLine(name); // "Default"استخدام ?. مع الأحداث
يُعد عامل الوصول الشرطي عند null الطريقة القياسية الآمنة للخيوط لاستدعاء الأحداث؛ إذ يتجنب حالة السباق التي قد تحدث عند إجراء فحص منفصل للقيمة null ثم الاستدعاء.
public event EventHandler<DataEventArgs>? DataReceived;
// Thread-safe event invocation:
DataReceived?.Invoke(this, new DataEventArgs(data));
// This is equivalent to:
var handler = DataReceived;
if (handler != null) handler(this, new DataEventArgs(data));
// (local copy avoids race condition between check and invoke)أمثلة معقدة على التسلسل
يتيح الجمع بين العوامل التنقلَ الآمن والواضح والقابل للقراءة عند التعامل مع مخططات الكائنات المتداخلة بعمق.
var order = GetOrder(id);
// Deeply nested with fallbacks:
string countryCode = order
?.Customer
?.ShippingAddress
?.Country
?.Code
?? "US";
// Collection safe access:
decimal firstLineTotal = order
?.Lines
?.FirstOrDefault()
?.Total
?? 0m;
// Method chain:
string? trackingUpper = order?.TrackingNumber?.ToUpper().Trim();العامل Null-Conditional في LINQ
يعمل العامل null-conditional بسلاسة مع LINQ، مما يتيح تنفيذ استعلامات آمنة على المجموعات أو الخصائص التي قد تكون null.
List<Order>? orders = customer?.Orders;
// Safe LINQ on a nullable collection:
var totalRevenue = orders?.Sum(o => o.Total) ?? 0m;
var pendingCount = orders?.Count(o => o.Status == OrderStatus.Pending) ?? 0;
var latest = orders?.MaxBy(o => o.PlacedAt)?.Id;حواجز null باستخدام ThrowIfNull
بالنسبة إلى المعلمات التي يجب ألا تكون null، استخدم ArgumentNullException.ThrowIfNull() (في .NET 6+) لإجراء تحقق موجز وواضح عند دخول الطريقة.
public void ProcessOrder(Order order, Customer customer)
{
ArgumentNullException.ThrowIfNull(order);
ArgumentNullException.ThrowIfNull(customer);
// From this point, compiler knows both are non-null
Console.WriteLine(order.Id);
Console.WriteLine(customer.Name);
}
// .NET 7+: ArgumentException.ThrowIfNullOrEmpty
void Save(string name)
{
ArgumentException.ThrowIfNullOrWhiteSpace(name);
// name is guaranteed non-empty
}نمط Is Not Null في Switch
يوفر مطابقة الأنماط باستخدام is not null وis { } أنماطًا واضحة لفحص null، ولا سيما في تعبيرات switch.
string Describe(object? obj) => obj switch
{
null => "nothing",
string s when s.Length == 0 => "empty string",
string s => $"string: {s}",
int i => $"integer: {i}",
{ } => $"object: {obj.GetType().Name}"
};
// is not null in if statements:
if (order is not null && order.Customer is { Name: var name })
Console.WriteLine(name);اختبار سريع
ماذا يعيد التعبير user?.Name ?? "Anonymous" عندما تكون قيمة user هي null؟
مراجعة: Null-Conditional وNull-Coalescing
أهم النقاط:
?.: الوصول الآمن إلى الأعضاء؛ يعيد null بدلًا من إلقاء استثناء عند كون الكائن المستقبِل null?[]: الوصول الآمن إلى الفهارس في المجموعات التي قد تكون null??: قيمة بديلة عندما يكون المعامل الأيسر null??=: التعيين فقط إذا كانت القيمة null؛ وهو مناسب جدًا للتهيئة الكسولة- سلسِلها:
a?.B?.C ?? defaultValللتنقل الآمن عند null داخل بنى متداخلة بعمق ArgumentNullException.ThrowIfNull()لإنشاء حواجز للتحقق من المعلمات
الأسئلة الشائعة
هل درس «العوامل Null-Conditional وNull-Coalescing» مجاني؟
نعم — نص درس «العوامل Null-Conditional وNull-Coalescing» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «العوامل Null-Conditional وNull-Coalescing»؟
اجمعوا بين ?., ?[], ?? و??= لكتابة شيفرة موجزة وآمنة تجاه null دون فحوصات مطوّلة. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «العوامل Null-Conditional وNull-Coalescing»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تمكين NRT وفهمه
- التعليقات التوضيحية: ? و! وMaybeNull وNotNull
- العوامل Null-Conditional وNull-Coalescing
- ترحيل قاعدة شيفرة إلى NRT