יום שני, 4 בדצמבר 2017

מספר פרמטרים משתנה - C#) params)

params
כמו בהרבה שפות, ב-#C קיימת אפשרות שפונקציה תקבל מספר משתנה של פרמטרים.
בשפת C ראינו את זה הרבה בפונקציות ()printf וְ ()scanf שמדפיסות או מקבלות מספר משתנים ככל העולה על רוחנו.




תחביר:
 שם_הפונקציה   ערך_מוחזר(params טייפ_הפרמטרים[] name){.....}

כל הפרמטרים נכנסים לפונקציה במערך. ה"Length" של המערך שווה למספר הפרמטרים שהוזנו.




דוגמה 1:
    class Program
    {
        public static int Sum(params int[] numbers)
        {
            int sum = 0;
            for (int i = 0; i < numbers.Length; i++)
            {
                sum += numbers[i];
            }
            return sum;
        }
        static void Main(string[] args)
        {
            Console.WriteLine(Sum());  // ידפיס 0
            Console.WriteLine(Sum(3, 5));  // ידפיס 8
            Console.WriteLine(Sum(3, 5, 10));  // ידפיס 18
        } 
    }






דוגמה 2:
-קבלת פרמטר רגיל ועוד פרמטר מסוג params.
-שימוש בפונקציה השמורה למערכים: "Sum".
    class Program
    {
        public static void ShowSum(String str, params int[] numbers)
        {
            Console.WriteLine(str + numbers.Sum());
        }
        static void Main(string[] args)
        {
            ShowSum("Sum: ");  // Sum: 0
            ShowSum("Sum: ", 3, 5);  // Sum: 8
            ShowSum("Sum: ", 3, 5, 10);  // Sum: 18
        }
    }


שימו לב:
- מערך הפרמטרים "params" חייב להיות אחרון ברשימת הפרמטרים שמקבלת הפונקציה.
.לא חוקי "public static void ShowSum(params int[] numbers, String str){...}"  ,לכן  
- אסור שיהיה יותר מ"params" אחד.






ל-params יש יכולת נוספת: קבלת מערך רגיל.

    class Program
    {
        public static void ShowSum(String str, params int[] numbers)
        {
            Console.WriteLine(str + numbers.Sum());
        }
        static void Main(string[] args)
        {
            int[] arr = new int[3] { 3, 5, 10 };
            ShowSum("Sum: ",arr);  // Sum: 18
        }
    }







חסרונו הגדול של params:
בסי שארפ params לא יכול להשפיע על המשתנים המקוריים. לכן הוא לא יכול להיות ref או out.
בשפת C פשוט שלחנו לפונקציה מצביעים למשתנים שברצוננו להשפיע עליהם (לרוב עם הפונקציה scanf), אבל ב#C אין מצביעים.

מצאתי לזה שלושה פתרונות סבירים:
1. לשלוח מערך. פונקציה ב#C משפיעה על איברי המערך המקורי (מומלץ).
2. לכתוב הרבה פונקציות בעלות שם זהה שמקבלות מספר שונה של פרמטרים (מוגבל וארוך אך לפעמים האפשרות הכי טובה)
3. לקבל הרבה פרמטרים עם ברירת מחדל. להשתמש בכל אחד בתנאי שהוא לא בערך ברירת המחדל שלו. (ארוך. לא תמיד ניתן להעניק ערך ברירת מחדל - כגון כש-int שצריך להיות מסוגל לקבל כל מספר חיובי ושלילי).











כלי פשוט ושימושי.

אין תגובות:

הוסף רשומת תגובה