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 כערך ברירת מחדל יגרום לשגיאת קומפילציה.
כשנקרא לפונקציה נראה את הדבר הבא:
יוצא מן הכלל האמור לעיל היא dynamic, לפרמטר מסוג dynamic אפשר לתת רק את הערך null היות שהקומפיילר חושב שזה Reference Type, לדעתי זה באג ואני מקווה שזה יתוקן עד הגרסה הסופית, בכל מקרה מצאתי דרך לעקוף את הבעייה הזאת ולתת לפרמרטר מסוג dynamic כל ערך שנרצה, אבל זה יצטרך לחכות לפוסט של מחרתיים שבו אני אראה מה קורה מאחורי הקלעים של Optional Parameters ואז נבין איך אפשר לעקוף את הבעייה.
בפוסט מחר אני אדגים בעזרת ה' הפעלה של בדיקת איות של Word ותווכחו לדעת שעד ל - C# 4.0 הקוד היה מכוער מאוד והיום אפשר לכתוב את אותו קוד בצורה הרבה יותר הגיונית.