244. How default arguments values work

מהטיפ הקודם, אפשר היה לחשוב שהמימוש של Default arguments values הוא ע”י יצירת מספיק Overloadים.

כלומר שאם נציין Default Values לפרמטרים שלנו, אז יווצרו הרבה מאוד Overloadים (באופן מדויק – 2 בחזקת מספר הפרמטרים שיש להם Default).

אם נפתח את הReflector על מה שכתבנו פעם קודמת:

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), includeRemovals: false);

נראה את הקוד הבא:

1
2
bool temp00000 = false;
UpdateRows(rows, TimeSpan.FromSeconds(5.0), true, temp00000, true);

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

זו אחת הסיבות שהם צריכים להיות Compile-time, כי הם בעצם Constים שמוכנסים באופן דיפולטי לכל הפונקציות. (ראו גם טיפ מספר 14)

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

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

שתף