المعاملات الاختيارية
جزء من قسم 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. لا يمكنك استخدام المتغيرات أو استدعاءات الدوال كقيم افتراضية. وهذا يجعل المعاملات الاختيارية مثالية لإعدادات التكوين والدوال التي يستخدم فيها معظم المستدعين قيمًا شائعة.
التحدي
سهللنقم ببناء نظام إشعارات يستخدم المعلمات الاختيارية (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 ثلاث مرات واطبع كل نتيجة:
- الاستدعاء الأول: مرر الرسالة الأولى فقط (يستخدم القيم الافتراضية: أولوية
"Normal"، وتمكين الطابع الزمني) - الاستدعاء الثاني: مرر الرسالة الثانية مع أولوية
"Urgent"(لا يزال الطابع الزمني افتراضياً true) - الاستدعاء الثالث: مرر الرسالة الثالثة مع أولوية
"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
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injection