32. default(T) keyword

כאשר אנחנו כותבים מתודה המחזירה Type גנרי, לפעמים קורה שאנחנו רוצים להחזיר null.

הבעיה היא שאז לא נוכל להחזיר null במידה וT הוא value type.

לכן היינו רוצים להחזיר null במידה ומדובר בReference type.

במידה וT הוא value type כנראה נרצה להחזיר משהו כמו 0, false או הערך הדיפולטי של הType – בד”כ מדובר בType כשכל הערכים בו מאותחלים בערך הדיפולטי שלהם, כאשר הוא לtypeים הנומריים הערך הדיפולטי הוא 0.

יש תמיכה בדבר כזה, באמצעות הkeyword שנקרא default:

באופן כללי כל member שלא אתחלנו אותו בעצמנו, יאותחל בערך default() של הType שלו:

1
private int m_Member = default(int);

שקולה לשורה

1
private int m_Member = 0;

או לשורה

1
private int m_Member;

באופן דומה זה נכון גם לכל Type ואין משהו מיוחד בint.

עוד דוגמה:

השורות הבאות שקולות

1
2
3
private string m_Member = default(string);
private string m_Member = null;
private string m_Member;

string הוא לא value type ולכן מאותחל בnull.

גם אם המשתנה גנרי קורה אותו הדבר והשורות הבאות שקולות:

1
2
private T m_Member = default(T);
private T m_Member;

בכל מקרה נוכל גם להשתמש בזה גם במתודות גנריות, למשל המתודה שראינו פעם:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static T Max<T>(T[] array)
where T : IComparable
{
if (array.Length == 0)
{
throw new ArgumentException("Array was empty",
"array");
}
else
{
T currentMax = array[0];
foreach (T element in array)
{
if (element.CompareTo(currentMax) > 0)
{
currentMax = element;
}
}
return currentMax;
}
}

נוכל להחזיר במקרה של 0 פרמטרים את default(T):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static T Max<T>(T[] array)
where T : IComparable
{
if (array.Length == 0)
{
return default(T);
}
else
{
T currentMax = array[0];
foreach (T element in array)
{
if (element.CompareTo(currentMax) > 0)
{
currentMax = element;
}
}
return currentMax;
}
}

יום גנרי טוב

שתף