כשכותבים switch, האם זה נשאר כך ?
טוב, כנראה החוויה הקשה שעברתי עם מחיקת הפוסט של ה FxCop בזמן publish, לא עוזבת אותי,
כי אני ממשיך לכתוב אודותיו.
בכל מקרה, המשכתי קצת לשחק עם הקוד, וגיליתי משהו מעניין, החוק שמחייב אותנו, לממש case עבור כל האפשריות ב enum, עובד רק עם ממשנו יותר מ case אחד, במדה וממשנו רק case אחד, ה Code Analysis יתעלם לגמרי מכל מה שאנחנו כותבים והוא יעביר את הקוד קומפילציה,
אז כדי להבין מה קורה, כתבתי את הקוד הבא, והסתכלתי ב reflector, וגיליתי דברים חדשים,
1 public void f2(MyEnum myEnum)
2 {
3 switch (myEnum)
4 {
5 case MyEnum.A:
6 Console.WriteLine();
7 break;
8 case MyEnum.B:
9 Console.WriteLine();
10 break;
11 case MyEnum.C:
12 Console.WriteLine();
13 break;
14 default:
15 Console.WriteLine();
16 break;
17 }
18 }
19
20 public void f1(MyEnum myEnum)
21 {
22 switch (myEnum)
23 {
24 case MyEnum.A:
25 Console.WriteLine();
26 break;
27 default:
28 Console.WriteLine();
29 break;
30 }
31 }
32 }
כעת נסתכל מה הקומפיילר באמת עושה, נפתח את ה Refloctor, ונראה מה כתוב שם:
אז הנה הקוד של f2 שבו אנחנו עושים מעבר על יותר מ case אחד:
כמובן בדיוק כמו שאנו מצפים, בלוק של switch שעושה בדיוק מה שכתבנו בקוד,
אבל נציץ על הקוד שמיוצר מ f1, שבו אנחנו עושים case רק על מקרה אחד (ה default לא נחשב)
אופה, אין שמץ של switch, יש בלוק if רגיל,
מסתבר שמישהו השקיע מחשבה וזמן, כדי לבדוק האם אנחנו עושים case רק על אחד,
לא ברור לי למה, מה היתרון שבלוק if נותן לנו, למה אי אפשר היה להשאיר את זה כ switch,
מה שאני כן יודע, זה שזה דופק לי את ה ForceSwitch, שכתבתי בעמל רב
בפוסט הקודם,
אשמח אם למישהו יהיה פיתרון.