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

الكلمة المفتاحية '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.

challenge icon

التحدي

سهل

لنقم ببناء منسق رسائل مرن يستخدم الكلمة المفتاحية 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
        // واطبع النتيجة
        
    }
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming