الكلمة المفتاحية 'params'
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 47 من 70.
تسمح الكلمة المفتاحية params للدالة بقبول عدد متغير من الوسائط من نفس النوع. فبدلاً من مطالبة المستدعين بإنشاء مصفوفة يدوياً، يمكنهم تمرير الوسائط مباشرة، مفصولة بفاصلات.
ضع params قبل معامل المصفوفة في توقيع الطريقة:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// كل هذه الاستدعاءات تعمل
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (مصفوفة فارغة)يقوم المترجم تلقائياً بتغليف الوسائط داخل مصفوفة. يمكنك أيضاً تمرير مصفوفة موجودة بالفعل بشكل مباشر إذا كان لديك واحدة:
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60هناك بعض القواعد التي يجب تذكرها: يمكن أن تحتوي الطريقة على معامل params واحد فقط، ويجب أن يكون المعامل الأخير في القائمة. يمكنك دمجه مع المعاملات العادية:
public static void Log(string prefix, params object[] items)
{
foreach (var item in items)
Console.WriteLine(prefix + item);
}
Log("Item: ", "Apple", 42, true);تجعل الكلمة المفتاحية params واجهات برمجة التطبيقات (APIs) أكثر مرونة وسهولة في الاستخدام للمستدعي، ولهذا السبب تراها في دوال مثل Console.WriteLine و string.Format.
التحدي
سهللنقم ببناء منسق رسائل مرن يستخدم الكلمة المفتاحية params للتعامل مع أي عدد من القيم. ستقوم بإنشاء فئة مساعدة (utility class) يمكنها تنسيق الرسائل بوسائط متغيرة، مما يوضح كيف تجعل params الأساليب (methods) أكثر تنوعاً وسهولة في الاستخدام للمستدعي.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
MessageFormatter.cs: أنشئ فئةMessageFormatterداخل مساحة الأسماءFormattingمع طريقتين تستخدمانparams:Combine(params string[] parts)- تدمج جميع السلاسل النصية المقدمة مع مسافة بينها وتعيد النتيجة.FormatList(string label, params int[] numbers)- تدمج معاملًا عاديًا مع مصفوفةparams. يجب أن تعيد التسمية (label) متبوعة بنقطتين، ثم جميع الأرقام مفصولة بفاصلات (على سبيل المثال،Scores: 85, 90, 78).
Program.cs: في ملفك الرئيسي، قم بتطبيق كلتا الطريقتين مع المدخلات. اقرأ سلسلة نصية للتسمية، ثم اقرأ سطرًا من الأعداد الصحيحة المفصولة بفاصلات. استخدمCombineلدمج ثلاث كلمات ثابتة، واستخدمFormatListلعرض التسمية مع الأرقام.
ستتلقى مدخلين:
- سلسلة نصية للتسمية (على سبيل المثال،
Scores) - قائمة من الأعداد الصحيحة مفصولة بفاصلات (على سبيل المثال،
85,90,78,92)
أولاً، قم باستدعاء Combine مع الكلمات "Hello" و "params" و "world!" واطبع النتيجة. ثم قم بتحليل الأعداد الصحيحة المفصولة بفاصلات إلى مصفوفة واستدعِ FormatList مع التسمية ومصفوفة الأعداد الصحيحة، واطبع تلك النتيجة أيضاً.
على سبيل المثال، إذا كانت المدخلات هي Scores و 85,90,78، يجب أن يكون الناتج:
Hello params world!
Scores: 85, 90, 78لاحظ كيف يقبل Combine أي عدد من السلاسل النصية مباشرة، بينما يوضح FormatList أنه يمكنك خلط المعاملات العادية مع params - يحتاج معامل params فقط إلى أن يكون في الأخير. يمكنك أيضاً تمرير مصفوفة موجودة إلى طريقة تستخدم params، وهو بالضبط ما ستفعله مع الأعداد الصحيحة التي تم تحليلها!
ورقة مرجعية
تسمح الكلمة المفتاحية params للطريقة (method) بقبول عدد متغير من الوسائط من نفس النوع دون مطالبة المستدعين بإنشاء مصفوفة يدويًا:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// كل هذه الاستدعاءات تعمل
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (مصفوفة فارغة)يمكنك تمرير مصفوفة موجودة مباشرة إلى طريقة params:
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60قواعد params:
- يمكن أن تحتوي الطريقة على معامل
paramsواحد فقط - يجب أن يكون المعامل الأخير في القائمة
- يمكن دمجه مع معاملات عادية
public static void Log(string prefix, params object[] items)
{
foreach (var item in items)
Console.WriteLine(prefix + item);
}
Log("Item: ", "Apple", 42, true);جرّب بنفسك
using System;
using Formatting;
class Program
{
public static void Main(string[] args)
{
// قراءة المدخلات
string label = Console.ReadLine();
string numbersInput = Console.ReadLine();
// TODO: استخدم MessageFormatter.Combine مع "Hello" و "params" و "world!"
// واطبع النتيجة
// TODO: قم بتحليل الأعداد الصحيحة المفصولة بفاصلة إلى مصفوفة int
// تلميح: قم بتقسيم السلسلة النصية (Split) وتحويل كل جزء إلى int
// TODO: استخدم MessageFormatter.FormatList مع label ومصفوفة int
// واطبع النتيجة
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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