Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

المعاملات الاختيارية

جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 48 من 70.

البارامترات الاختيارية (Optional parameters) تسمح لك بتحديد قيم افتراضية لبارامترات الأساليب (methods). عندما لا يوفر المستدعي قيمة لهذا البارامتر، يتم استخدام القيمة الافتراضية تلقائيًا.

يمكنك إنشاء معلمة اختيارية عن طريق تعيين قيمة افتراضية في توقيع الطريقة:

public static void Greet(string name, string greeting = "Hello")
{
    Console.WriteLine(greeting + ", " + name + "!");
}

// كلا الاستدعاءين يعملان
Greet("Alice");              // Hello, Alice!
Greet("Bob", "Welcome");     // Welcome, Bob!

يجب أن تأتي المعلمات الاختيارية بعد جميع المعلمات المطلوبة. يمكنك الحصول على عدة معلمات اختيارية، ويمكن للمستدعين حذف أي منها من جهة اليمين:

public static void CreateUser(string name, int age = 0, bool isActive = true)
{
    Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}

CreateUser("Emma");                    // Emma, Age: 0, Active: True
CreateUser("James", 25);               // James, Age: 25, Active: True
CreateUser("Sarah", 30, false);        // Sarah, Age: 30, Active: False

يجب أن تكون القيم الافتراضية ثوابت وقت التصريف - قيم حرفية، أو قيم const، أو تعبيرات default. لا يمكنك استخدام المتغيرات أو استدعاءات الدوال كقيم افتراضية. وهذا يجعل المعاملات الاختيارية مثالية لإعدادات التكوين والدوال التي يستخدم فيها معظم المستدعين قيمًا شائعة.

challenge icon

التحدي

سهل

لنقم ببناء نظام إشعارات يستخدم المعلمات الاختيارية (optional parameters) لتوفير تنسيق مرن للرسائل. ستقوم بإنشاء فئة أدوات مساعدة يمكنها إرسال إشعارات بإعدادات قابلة للتخصيص، حيث سيستخدم معظم المستدعين القيم الافتراضية المنطقية.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • NotificationService.cs: أنشئ فئة NotificationService داخل مساحة الأسماء Notifications مع طريقة (method) توضح المعلمات الاختيارية:
    • SendNotification(string message, string priority = "Normal", bool addTimestamp = true) - يجب أن تعيد هذه الطريقة سلسلة نصية منسقة للإشعار. عندما تكون قيمة addTimestamp هي true، قم بإضافة البادئة [TIMESTAMP] للرسالة. يجب أن يكون التنسيق: [Priority] Message أو [TIMESTAMP] [Priority] Message بناءً على إعداد الطابع الزمني.
  • Program.cs: في ملفك الرئيسي، وضح كيفية عمل المعلمات الاختيارية من خلال استدعاء SendNotification بثلاث طرق مختلفة - باستخدام جميع القيم الافتراضية، وتجاوز معلمة واحدة، وتجاوز كلتا المعلمتين الاختياريتين.

ستتلقى ثلاثة مدخلات:

  • الرسالة الأولى (ستستخدم جميع القيم الافتراضية)
  • الرسالة الثانية (ستستخدم الأولوية "Urgent" مع الطابع الزمني الافتراضي)
  • الرسالة الثالثة (ستستخدم الأولوية "Low" وبدون طابع زمني)

قم باستدعاء SendNotification ثلاث مرات واطبع كل نتيجة:

  1. الاستدعاء الأول: مرر الرسالة الأولى فقط (يستخدم القيم الافتراضية: أولوية "Normal"، وتمكين الطابع الزمني)
  2. الاستدعاء الثاني: مرر الرسالة الثانية مع أولوية "Urgent" (لا يزال الطابع الزمني افتراضياً true)
  3. الاستدعاء الثالث: مرر الرسالة الثالثة مع أولوية "Low" والقيمة false للطابع الزمني

على سبيل المثال، إذا كانت المدخلات هي System started، و Server overload، و Cache cleared، يجب أن يكون المخرج:

[TIMESTAMP] [Normal] System started
[TIMESTAMP] [Urgent] Server overload
[Low] Cache cleared

لاحظ كيف تتعامل نفس الطريقة مع السيناريوهات الثلاثة بأناقة - حيث يحدد المستدعون فقط ما يحتاجون إلى تغييره من القيم الافتراضية!

ورقة مرجعية

تسمح لك المعلمات الاختيارية (Optional parameters) بتحديد قيم افتراضية لمعلمات الطريقة (method parameters). عندما لا يوفر المستدعي قيمة، يتم استخدام القيمة الافتراضية تلقائيًا.

قم بإنشاء معلمة اختيارية عن طريق تعيين قيمة افتراضية في توقيع الطريقة (method signature):

public static void Greet(string name, string greeting = "Hello")
{
    Console.WriteLine(greeting + ", " + name + "!");
}

// Both calls work
Greet("Alice");              // Hello, Alice!
Greet("Bob", "Welcome");     // Welcome, Bob!

يجب أن تأتي المعلمات الاختيارية بعد جميع المعلمات المطلوبة. يمكنك الحصول على عدة معلمات اختيارية:

public static void CreateUser(string name, int age = 0, bool isActive = true)
{
    Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}

CreateUser("Emma");                    // Emma, Age: 0, Active: True
CreateUser("James", 25);               // James, Age: 25, Active: True
CreateUser("Sarah", 30, false);        // Sarah, Age: 30, Active: False

يجب أن تكون القيم الافتراضية ثوابت وقت التصريف (compile-time constants) - قيم حرفية (literals)، أو قيم const، أو تعبيرات default. لا يمكنك استخدام المتغيرات أو استدعاءات الطرق كقيم افتراضية.

جرّب بنفسك

using System;
using Notifications;

class Program
{
    public static void Main(string[] args)
    {
        // قراءة الرسائل الثلاث
        string message1 = Console.ReadLine();
        string message2 = Console.ReadLine();
        string message3 = Console.ReadLine();

        // إنشاء مثيل (instance) من NotificationService
        NotificationService service = new NotificationService();

        // TODO: استدعاء SendNotification ثلاث مرات وطباعة كل نتيجة:
        // 1. الاستدعاء الأول: تمرير message1 فقط (يستخدم جميع القيم الافتراضية)
        // 2. الاستدعاء الثاني: تمرير message2 مع أولوية "Urgent" (القيمة الافتراضية لـ timestamp هي true)
        // 3. الاستدعاء الثالث: تمرير message3 مع أولوية "Low" و false لـ timestamp

    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming