المسارات
/
C#
C#
/
التمارين
/
Tim من التسويق
Tim من التسويق

Tim من التسويق

تمرين تعلّمي

مقدمة

قابلية الأنواع لـ 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

التعليمات

في هذا التمرين ستكتب كودًا لطباعة شارات الأسماء لموظفي المصنع.

1. اطبع شارة لموظف

لدى الموظفين معرّف واسم واسم قسم. تُنسَّق تسميات شارات الموظفين على النحو التالي: "[id] - name - DEPARTMENT". نفّذ الطريقة (static) Badge.Print() لتُرجع تسمية شارة الموظف:

Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"

لاحظ أنه يجب كتابة اسم القسم بأحرف كبيرة في التسمية.

2. اطبع شارة لموظف جديد

بسبب خلل في نظام الحاسوب، لا يملك الموظفون الجدد أحيانًا معرّفًا بعد عندما يبدأون العمل في المصنع. ولأن الشارات مطلوبة، سيحصلون على شارة مؤقتة بدون بادئة المعرّف. عدّل الطريقة (static) Badge.Print() لتدعم الموظفين الجدد الذين ليس لديهم معرّف بعد:

Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"

3. اطبع شارة للمالك

حتى مالك المصنع عليه أن يرتدي شارة في جميع الأوقات. لكن المالك ليس لديه قسم. في هذه الحالة، يجب أن تطبع التسمية "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"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
C# Exercism

مستعد لبدء Tim من التسويق؟

سجّل في Exercism لتتعلّم وتتقن C# عبر 62 مفهومًا178 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.