209. Tweaking Enum GetValues

ראינו פעם שעברה שאפשר לקבל את כל הערכים של Enum מסוים בעזרת הפונקציה Enum.GetValues.

מי שיציץ בReflector על הפונקציה הזאת יגלה מספר דברים מעניינים:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static class EnumValues<TEnum>
where TEnum : struct, IConvertible
{
private static TEnum[] mEnumValues = InitValues();
private static TEnum[] InitValues()
{
TEnum[] result = (TEnum[])Enum.GetValues(typeof(TEnum));
return result;
}
public static TEnum[] GetValues()
{
TEnum[] arrayCopy = new TEnum[mEnumValues.Length];
mEnumValues.CopyTo(arrayCopy, 0);
return arrayCopy;
}
}

שימו לב שנוצרת מחלקה סטטית עבור כל סוג Enum שנכניס במשתנה הגנרי (ראו גם טיפ מספר 177).

בנוסף, שימו לב כי שמנו Constraint שTEnum הוא Value Type ומממש IConvertible, זאת מאחר ואי אפשר להכריח בConstraint שמשתנה גנרי הוא Enum. (ראו גם טיפ 29)

הדבר הזה מאפשר לנו לקבל בצורה יותר מהירה, בלי Boxing מערך שהוא Type safe של הערכים של הEnum שביקשנו.

המשך יום גנרי ערכי סטטי.

שתף