Named and Optional Arguments in C# 4.0

| More
נוסף ב-15/04/2010 14:50 על ידי דניאל כץ

ארגומנטים אופציונאליים והצבת ארגומנטים לפי שם

ב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")
 {...}

הכללים לשימוש בארגומנטים אופציונאליים הם:

  • יש להכריז את כל הארגומנטים המנדטוריים לפני האופציונאליים.
  • בקריאה למתודה, חובה להעביר ערכים לכל הפרמטרים המנדטוריים.
  • ערכם של הארגומנטים האופציונאליים מוערכים לפי סדר הכרזתם.
  • כשיש שתי מתודות שמתאימות בחתימתם לצורת הקריאה אז תינתן עדיפות למתודה ללא הערכים האופציונאליים.

Tags: ,

.NET 4.0

הערות

17/04/2010 22:05:11 #

ומה קורה כשיש שני אלמנטים אופציונלים מסוג זהה (למשל 2 string) ואני מעוניין בקריאה לשיטה לכתוב דווקא את השני?
איך בכזה מקרה ניתן להבחין בינהם?

drvvv Israel

18/04/2010 13:48:30 #

לשם כך הוסיפו תמיכה בהצבת ארגומנטים לפי שם. לדוגמה מתודה שמוכרזת כך:
static void Method(string str1 = "", string str2 = "") {/* ... */}
a

תוכל לקרוא לה בשני הדרכים הבאות (ללא שום הבדל בביצוע):

Method(str1: "hello", str2: "world");
Method(str2: "hello", str1: "world");
a

(הaים נועדו לרמות את מנגנון הBIDI ולהציג את הקוד משמאל לימין ואינם חלק מהקוד.)

דניאל כץ Israel

הוסף תגובה




biuquote
  • הערה
  • תצוגה מקדימה
Loading