DCSIMG
C# 4.0 Part 8 - First glance on the Optional Parameters - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

C# 4.0 Part 8 - First glance on the Optional Parameters

 

אחד מהתכונות החדשות של C# 4.0 היא Optional Parameters.
 
למעשה - המצב עד היום שלא היה לנו את האופציה של פרמטרי רשות, הרגיל אותנו לכתוב קוד לא כל כך נכון, למה הכוונה - 
שימו לב לשני קטעי הקוד הבאים, הראשון - עושה overload למתודת Abs וקטע הקוד השני עושה overload למתודת Add. אז מה בכל זאת ההבדל ? 
 

    public static class Math

    {

        public static decimal Abs(decimal value);

        public static double Abs(double value);

        public static float Abs(float value);

        public static int Abs(int value);

        public static long Abs(long value);

        public static sbyte Abs(sbyte value);

        public static short Abs(short value);

    }

 

    public class Persons

    {

        public void Add(string name, int id, float age);

        public void Add(string name, int id);

        public void Add(string name);

    }

 
 
קטע הקוד הראשון באמת משתמש במנגנון ה - overload כמו שצריך, לכל מתודה יש מימוש שונה לפי סוג הפרמטר שהיא קבלה, לעומת זאת קטע הקוד השני משתמש במנגנון ה - overload כדי להקל על מי שישתמש ב - class הזה, והקוד היחיד שיש בתוך המתודות זה קריאה למתודה שמקבלת את כל המשתנים, ושליחת ערכי ברירת מחדל.
ומי שלא יצא לו לכתוב class שיש לו כמה Ctors שאחד קורה לשני שיקום.
 
סיבה נוספת להוספת תמיכה ב - Optional Parameters, היא תמיכה בקריאה לפונקציות משפות אחרות שתומכים ב - Optional Parameters, ונראה את זה בפוסט מחר.
 
 
אז איך משתמשים בתכונה הנפלאה הזאת.
 

    static void Add(int id, string name = "", float age = 0)

    {

    }

 
אנחנו כותבים בהתחלה את כל פרמרטרי החובה ואז את פרמטרי הרשות. אפשר להגדיר כערך ברירת מחדל רק מה שמוכר בזמן קומפילציה, ולכן נוכל לשלוח רק:
ערכי Const ל - Value Type או
null ל - Reference Type או
קריאה ל - default ctor של struct. לדוגמא - הההגדרה הבאה הינה חוקית:
 

   static void Add(int id = 0, string name = "",

                        Person person = null, DateTime dt = new DateTime())

   {

   }

 
לעומת זאת ניסיון לתת את DateTime.Now או את string.Empty כערך ברירת מחדל יגרום לשגיאת קומפילציה.
 
 
כשנקרא לפונקציה נראה את הדבר הבא:
 
 
Call function with optional parameters
 
 
יוצא מן הכלל האמור לעיל היא dynamic, לפרמטר מסוג dynamic אפשר לתת רק את הערך null היות שהקומפיילר חושב שזה  Reference Type, לדעתי זה באג ואני מקווה שזה יתוקן עד הגרסה הסופית, בכל מקרה מצאתי דרך לעקוף את הבעייה הזאת ולתת לפרמרטר מסוג dynamic כל ערך שנרצה, אבל זה יצטרך לחכות לפוסט של מחרתיים שבו אני אראה מה קורה מאחורי הקלעים של Optional Parameters ואז נבין איך אפשר לעקוף את הבעייה.
 
 
בפוסט מחר אני אדגים בעזרת ה' הפעלה של בדיקת איות של Word ותווכחו לדעת שעד ל - C# 4.0 הקוד היה מכוער מאוד והיום אפשר לכתוב את אותו קוד בצורה הרבה יותר הגיונית.

תוכן התגובה

Maxim כתב/ה:

כמו שכבר כתבתי בעבר: כל הדברים הטובים (ופחות) גולשים מ- VB ל- #C...

VB Rules!

# June 25, 2009 4:12 PM

erezh כתב/ה:

הרבה לפני VB, זה היה ב- ++C...

אבל מה זה משנה, העיקר שסוף סוף אפשר לכתוב עם Optional params כמו שצריך.

# June 25, 2009 4:51 PM

שלמה גולדברג כתב/ה:

כמו שהבטחתי אני רוצה להדגים שימוש ב - Optional Parameters. הקוד הבא משתמש בבדיקת האיות של Word. public

# June 26, 2009 9:05 AM

י.ג. כתב/ה:

אני עובד על VS2010 ומשתמש ב Net 2.0 (תאימות)ואני באופן קבוע, משתמש בOptional Parameters (הרגלים רעים מVB). ככה שזה לא חידוש של 4.0.

# December 27, 2010 2:10 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 6 and 5 and type the answer here:


Enter the numbers above: