[C#] 008.避免給列舉型別的元素提供顯式的值 (enum在非特殊定義的情況下,建議別給整數值)

讀【157個完美化C#的建議】一書的理解筆記 - 008

重點:Enum的內建遞增數值機制,所以避免給列舉型別的元素提供顯式的值 

流程說明
1. Enum的機制 - 範例
2. 標準Enum
3. 非連續性的Enum - 情境範例
4. 結論

1. Enum的機制 - 範例

我們有以下的宣告,可以思考

ValueA 值為多少

ValueB 值為多少

ValueC 值為多少

 public enum MyWeek
{

            Monday = 1,
            Tuesday = 2,
            ValueA,
            ValueB,
            Wednesday = 3,
            ValueC,
            Thursday = 4,
            Friday = 5,
            Saturday = 6,
            Sunday = 7
}

Enum的機制會讓

ValueA = 3

ValueB = 4

ValueC = 4

// valueA  = 3  ==>基於 Tuesday =2 + 1    
int valueA = (int)MyWeek.ValueA;
// valueB = 4  ==>基於 Tuesday =2 + 2  (前一個Enum為 ValueTemp)
int valueB = (int)MyWeek.ValueB;
// valueC = 4  ==>基於 Wednesday =3 + 1  
int valueC = (int)MyWeek.ValueC;

也因此ValueA 等於 星期三 Wednesday

MyWeek week = MyWeek.ValueA;
// valueAResult ==>True 
bool valueAResult = week == MyWeek.Wednesday ? true : false;

2. 標準Enum 

標準Enum 就因此是不建議放入整數值 (顯式的值)

/// <summary>
/// 標準的Enum 定義 - 不該提供顯示的值 
/// </summary>
public enum MyWeekRight
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

3. 非連續性的Enum - 情境範例

但因應情境的考量,如果是非連續的Enum 則應該要放顯式值,才便於區分。

有以下宣告

/// <summary>
/// 如果有以下非連續性的Enum ,提供顯示的值才是明確的做法
/// </summary>
public enum CustomerMyweek
{
    Monday = 0,
    Tuesday = 0,
    Wednesday = 1,
    Thursday = 1,
    Friday = 2,
    Saturday = 2,
    Sunday = 2

}

應用上就可以依照 Enum數值對應,一周所屬的狀態。

//非連續性的應用
int today = (int)CustomerMyweek.Saturday;
switch (today)
{
    case 0:
        Console.Write("每周的痛苦期");
        break;
    case 1:
        Console.Write("每周的放空期");
        break;
    case 2:
        Console.Write("每周的快樂期");
        break;

}

4. 結論

連續性資料 : Enum 不設整數值

非連續性資料 : Enum設整數值

github連結(Vs2015) : 點我下載