1.Enum共通設計原則
2.Flag Enum設計原則
假日是一個拖搞的開始,今天預計寫Enum的設計原則
Enum是一種特別value type
包括Simple Enums跟Flag Enums
Simple Enum代表一組提供使用者選擇的集合
例如,有一個Weekday的Enum。裡頭包括Monday ~ Sunday
public enum Weekday{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
Flag Enum是支持位元運算子(bitwise operations)的enum
像是AND,OR,NOT,XOR這些
我們有個專案用Flag Enum來做權限,範例如下
[Flags]
public enum Permission{
None = 0,
Read = 1,
Create = 2,
Edit = 4,
Delete = 8
}
當某個登入者有多個權限時,用OR連結
Permission.Read | Permission.Create | Permission.Edit
以下分別介紹Enums的共通原則,再針對Flag Enums特別說明
用Enum當參數可以增加可讀性
用Enum取代static class
Enum必須是封閉集合的組合,不是隨時會增加的東西
不要加上沒有屁用的value,也不要想說未來會用到就先加。沒用的value不要加在裡面
只有兩個value的Enum,雖然可以用Boolean取代。但是用Enum可讀性會更佳
/** 使用Boolean,可讀性差 **/
FileStream f = File.Open("foo.txt", true, false);
/** 使用Enum,可讀性高 **/
FileStream f = File.Open("foo.txt", CasingOptions.CasSensitive, FileMode.Open);
6.在Simple Enum中,提供一個0的value當預設值
public enum EventType{
Error = 0,
Waring,
Information,
...
}
7.建議使用Int32 value
Enum中可以使用類型為 byte、sbyte、short、ushort、int、uint、long 或 ulong。
其中int32是最多語言共同擁有的類型
除非你用的是Flags Enum,而且value的數量超過32個
8.Flag Enum的名稱使用複數名詞,Simple Enum使用單數名詞
1.Flag Enum的名稱使用複數名詞
2.Flag Enum使用2進位,這樣比較好用OR
[Flags]
public enum Permission{
None = 0,
Read = 1,
Create = 2,
Edit = 4,
Delete = 8
}
3.雖然可以用OR連集,但是不要把各種不同類別的東西放在同一個Enum
/** 不好的,全部都搞再一起 **/
[Flags]
public enum BindingFlags{
Instance,
Static,
NonPublic,
Public
}
/** 好的,根據類別分開 **/
public enum Visibility{
NonPublic,
public
}
public enum MemberScope{
Instance,
Static
}