243. Default arguments values

בהמשך לפעם קודמת,

נניח שיש לנו פונקציה כזאת:

1
2
3
4
5
private static void UpdateRows(IEnumerable<DataRow> rows,
TimeSpan timeOut,
bool includeInserts,
bool includeRemovals,
bool generatePks)

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

בשביל למנוע זאת, נוכל ליצור Overloadים מתאימים לפונקציה עם הערכים הדיפולטיים, כך המשתמש לא יצטרך להשקיע מחשבה:

למשל:

1
2
3
4
5
6
7
private static void UpdateRows(IEnumerable<DataRow> rows,
TimeSpan timeOut,
bool includeRemovals,
bool generatePks)
{
UpdateRows(rows, timeOut, true, includeRemovals, generatePks);
}

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

לא באמת ניצור 16 Overloadים לכל הפרמטרים האופציונאליים.

בפועל מה שעושים זה מייצרים 2-4 Overloadים לפונקציה, ואם המשתמש רוצה משהו אחר, הוא צריך לציין את כל הפרמטרים (להשתמש בOverload הארוך)…

במקום זאת, בC# 4.0 נוספה תמיכה בציון הערך הדיפולטי של פרמטר של פונקציה. זה נעשה כך:

1
2
3
4
5
private static void UpdateRows(IEnumerable<DataRow> rows,
TimeSpan timeOut,
bool includeInserts = true,
bool includeRemovals = true,
bool generatePks = true)

כך המשתמש יכול לציין רק חלק מהפרמטרים בקריאה לפונקציה שלנו. אבל איך הקומפיילר יודע לאיזה פרמטרים התוכוונו? למשל במקרה הזה:

1
UpdateRows(rows, TimeSpan.FromSeconds(5));

ברור לאיזה פרמטרים התכוונו, פשוט לכולם.

אבל במקרה הזה:

1
UpdateRows(rows, TimeSpan.FromSeconds(5), true, false);

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

אם אנחנו רוצים בכל זאת לציין רק פרמטרים ספציפיים, נוכל בעזרת Named Arguments:

1
UpdateRows(rows,TimeSpan.FromSeconds(5), includeRemovals: false);

אם נרצה להשתמש בDefault arguments values נצטרך שהפרמטרים האלה יופיעו אחרונים בחתימה של הפונקציה.

כמו כן, הערכים של טיפוסים אלה צריך להיות Compile-time (ראו גם טיפ מספר 167 להסבר על המושג)

המשך יום דיפולטי טוב.

שתף