1. إيه هو الـ params؟

هو keyword في C# بيخليك تبعت أي عدد من الـ arguments من نفس النوع لـ method واحدة، من غير ما تحدد عددهم من الأول.
يعني بدل ما تكتب 10 parameters، تقول: “يا Method خد اللي انت عايزه وكمل”.


2. ليه نستخدمه؟

  • علشان تكتب code أكتر نظافة.
  • علشان تتجنب إنك تعمل overloads كتيرة لنفس method.
  • لو عندك method بتتعامل مع عدد parameters مش معروف (مثلاً: جمع أرقام، دمج كلام، إلخ).

3. طريقة الكتابة:

لازم تكون عبارة عن Cs Arrays

// Should be array  
public int Sum(params int[] numbers)  
{  
    int total = 0;  
    foreach (int num in numbers)  
    {  
        total += num;  
    }  
    return total;  
}  

4. إزاي تستدعيه؟

Sum(1, 2, 3);       // 6  
Sum(10, 20, 30, 40); // 100  
Sum(5);             // 5  
Sum();              // 0 (لو ال array فاضية)  

لو مكنتش استخدمت params:

Sum(new int[] {1, 2, 3}); // نفس النتيجة، لكن code أطول  

5. قواعد مهمة:

  • الـ parameter اللي معاه params لازم يكون آخر حاجة في الـ parameters.
  • مينفعش يكون فيه أكتر من params في method واحدة.
  • الـ params مش بتشتغل مع ref أو out. اللي اتكلمنا عنهم في الـ Cs Pass parameters
  • النوع بتاعه لازم يكون array (مثلاً: int[], string[]).

6. أمثلة تانية:

مثال مع strings:

public string MergeWords(params string[] words)  
{  
    return string.Join(" ", words);  
}  
 
// الاستخدام:  
MergeWords("I", "❤️", "C#"); // "I ❤️ C#"  

مثال مع mixing parameters:

public void SendEmail(string subject, params string[] recipients)  
{  
    foreach (string email in recipients)  
    {  
        Console.WriteLine($"Sending '{subject}' to {email}");  
    }  
}  
 
// الاستخدام:  
SendEmail("Hello", "ali@example.com", "mohamed@test.com");  

7. إيه الـ مشاكل أو Limitations؟

  • لو الـ arguments كتير جدًا، ممكن يسبب performance issues (لإن الـ array بيتعمل لها allocate في الـ heap).
  • مينفعش تستخدم params مع method overloading لو فيه methods تانية بنفس الاسم وعدد parameters متشابه. Overloading
  • مش كل الـ types ممكن تستخدمها (مثلاً: List<int> مش هتشتغل، لكن int[] هتشتغل).

8. إزاي تتجنب المشاكل دي؟

  • لو عايز parameters من أنواع مختلفة، استخدم overloading.
  • لو عارف عدد الـ arguments مسبقًا، استخدم optional parameters بدلًا منه.
  • لو الـ performance مهمة، استخدم Span<T> أو ReadOnlySpan<T> في حالات معينة.

9. أمثلة واقعية:

  • الـ Console.WriteLine() نفسها بتستخدم params عشان تقبل أي عدد من الـ arguments للـ formatting:
    Console.WriteLine("Name: {0}, Age: {1}", "Ali", 25);  

10. لو خلاصة الكلام:

  • الـ params ده سهل حياتك لما بتكون عايز تبعت بيانات كتيرة من نفس النوع من غير ما تتعب في كتابة arrays.
  • استخدمه بحكمة علشان متخليش الـ code بتاعك يبقى “بطيء” أو صعب القراءة.

الكلمة الأخيرة:
“الـ params زي العسل.. لو زودته كتير هتندم، لكن لو استخدمته بالظبط هتستمتع بيه 😉”