null
في C#، تُستخدم القيمة الحرفية null للدلالة على غياب القيمة. والنوع القابل لـ null هو نوع يسمح بقيم null.
قبل الإصدار 8.0 من C#، كانت أنواع المراجع تقبل null دائمًا، أما أنواع القيم فلم تكن كذلك. ويمكن جعل نوع القيمة قابلًا لـ null بإلحاق علامة استفهام به (?).
string nullableReferenceType = "hello";
nullableReferenceType = null; // Valid as type is nullable
int nonNullableValueType = 5;
nonNullableValueType = null; // Compile error as type is not nullable
int? nullableValueType = 5; // Define nullable value type
nullableValueType = null; // Valid as type is nullable
الوصول إلى عضو في متغير قيمته null لا يسبب خطأ في التصريف، لكنه يؤدي إلى رفع استثناء NullReferenceException عند التنفيذ:
string sentence = null;
// Throws NullReferenceException at runtime
sentence.Length;
لمواجهة هذا النوع الشائع من الأخطاء، يتيح C# 8 تفعيل ميزة تجعل أنواع المراجع غير قابلة لـ null افتراضيًا:
string nonNullableReferenceType = "book";
nonNullableReferenceType = null; // Compile warning (no error!)
string? nullableReferenceType = "movie";
nullableReferenceType = null; // Valid as type is nullable
للتعامل بأمان مع القيم القابلة لـ null، تحقق مما إذا كانت تساوي null قبل استخدامها:
string NormalizedName(string? name)
{
if (name == null)
{
return "UNKNOWN";
}
// Value is not null at this point, so no compile warning
// and no runtime NullReferenceException being thrown
return name.ToUpper();
}
NormalizedName(null); // => "UNKNOWN"
NormalizedName("Elisabeth"); // => "ELISABETH"
يتيح العامل ?? إرجاع قيمة افتراضية عندما تكون القيمة null:
string? name1 = "John";
name1 ?? "Paul"; // => "John"
string? name2 = null;
name2 ?? "George"; // => "George"
يتيح العامل ?. استدعاء الأعضاء بأمان على قيمة قد تكون null:
string? fruit = "apple";
fruit?.Length; // => 5
string? vegetable = null;
vegetable?.Length; // => null
في هذا التمرين ستكتب كودًا لطباعة شارات الأسماء لموظفي المصنع.
لدى الموظفين معرّف واسم واسم قسم. تُنسَّق تسميات شارات الموظفين على النحو التالي: "[id] - name - DEPARTMENT". نفّذ الطريقة (static) Badge.Print() لتُرجع تسمية شارة الموظف:
Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"
لاحظ أنه يجب كتابة اسم القسم بأحرف كبيرة في التسمية.
بسبب خلل في نظام الحاسوب، لا يملك الموظفون الجدد أحيانًا معرّفًا بعد عندما يبدأون العمل في المصنع. ولأن الشارات مطلوبة، سيحصلون على شارة مؤقتة بدون بادئة المعرّف. عدّل الطريقة (static) Badge.Print() لتدعم الموظفين الجدد الذين ليس لديهم معرّف بعد:
Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"
حتى مالك المصنع عليه أن يرتدي شارة في جميع الأوقات. لكن المالك ليس لديه قسم. في هذه الحالة، يجب أن تطبع التسمية "OWNER" بدلًا من اسم القسم. عدّل الطريقة (static) Badge.Print() لتطبع تسمية للمالك:
Badge.Print(254, "Charlotte Hale", department: null);
// => "[254] - Charlotte Hale - OWNER"
لاحظ أنه من الممكن أن يكون المالك أيضًا موظفًا جديدًا:
Badge.Print(id: null, "Charlotte Hale", department: null);
// => "Charlotte Hale - OWNER"
سجّل في Exercism لتتعلّم وتتقن C# عبر 62 مفهومًا178 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.