ארגומנטים אופציונאליים והצבת ארגומנטים לפי שם
בC# 4.0 נוספה אפשרות להעביר ערך לארגומנט של מתודה בשמו (arg: "value") ולאו דווקא בסדר מסוים. אפשרות זו חיונית כדי לאפשר אפשרות חדשה נוספת שהיא - ארגומנטים אופציונאליים. הקוד הבא ממחיש העברה של הערך 1 לארגומנט ,copies את הערך"COLOR" לארגומנט ColorMode, ואת הערך "readme.txt" לארגומנט DocumentName:
Print(copies: 1, colorMode: "COLOR" , documentName: "readme.txt");
static void Print(string colorMode, string documentName, int copies) {...}
ארגומנטים אופציונאליים מוכרזים בC# על ידי ציון ערך ברירת המחדל עבור הארגומנט:
static void Print(int copies = 1, string colorMode = "Color" , string documentName = "" ) {...}
למתודה הזו ניתן לקרוא המגוון דרכים, חלקם מפורטים פה:
Print(1, "Color");
Print(1, "Color" , "My doc");
Print(copies: 1);
Print(colorMode: "Color");
Print(documentName: "myDoc.txt");
Print(copies: 1, colorMode: "Color");
Print(copies: 1, colorMode: "Color" , documentName: "myDoc.txt");
ארגומנטים אופציונאליים יכולים להפוך את הקוד לעמוס פחות, קריא יותר, וקל יותר לתחזוקה. בנוסף, הם הופכים את העבודה עם אובייקטי COM לקלה יותר (יותר, במאמר נפרד בל"נ). לדוגמה אם אנו מגדירים מתודה Print() שמקבלת מספר פרמטרים שונים, איננו צריכים עוד להעמיס מתודות רבות כמו:
public void Print(string documentName)
{
Print(documentName, 1, "COLOR");
}
public void Print(string documentName, int copies)
{
Print(documentName, copies, "COLOR");
}
public void Print(string documentName, int copies, string colorMode)
{...}
ארגומנטים אופציונאליים מאפשרים לנו לכתוב זאת כך:
public void Print(string documentName, int copies = 1, string colorMode = "COLOR")
{...}
הכללים לשימוש בארגומנטים אופציונאליים הם:
-
יש להכריז את כל הארגומנטים המנדטוריים לפני האופציונאליים.
-
בקריאה למתודה, חובה להעביר ערכים לכל הפרמטרים המנדטוריים.
-
ערכם של הארגומנטים האופציונאליים מוערכים לפי סדר הכרזתם.
-
כשיש שתי מתודות שמתאימות בחתימתם לצורת הקריאה אז תינתן עדיפות למתודה ללא הערכים האופציונאליים.