本文參考自C# 位域[flags],純屬讀書筆記,加深記憶
[Flags]的微軟解釋是“指示可以將枚舉作為位域(即一組標志)處理。”其實就是在編寫枚舉類型時,上面附上Flags特性后,用該枚舉變量是既可以象整數一樣進行按位的“|”或者按位的“&”操作了。
另外一個是在引用COM組件時使用,我沒有用過,你可以查看MSDN
這種用處很大,比如權限、執行狀態等,都可以用一個int型保存到數據庫中,C#中使用枚舉可以處理這個問題。
.Net中的枚舉一般有兩種用法
(1)、表示唯一的元素序列,列入一周天里面的各天
(2)、表示多種的復合狀態,這個時候一般需要為枚舉加上[Flags]特性為標記
下面通過代碼演示[Flags]特性的作用
1、不加[Flag]特性的代碼
public enum Permission { create = 1, read = 2, update = 4, delete = 8, } static void Main(string[] args) { Permission permission = Permission.create | Permission.read | Permission.update | Permission.delete; Console.WriteLine("1、枚舉創建,並賦值……"); Console.WriteLine(permission.ToString()); Console.WriteLine((int)permission); }
輸出:
2、加[Flag]特性的代碼
[Flags] public enum Permission { create = 1, read = 2, update = 4, delete = 8, } static void Main(string[] args) { Permission permission = Permission.create | Permission.read | Permission.update | Permission.delete; Console.WriteLine("1、枚舉創建,並賦值……"); Console.WriteLine(permission.ToString()); Console.WriteLine((int)permission); }
輸出:
3、分析上面的代碼,發現加上[Flags]特性之后,對於枚舉的追加操作,沒加特性的只是單純的從值上的相加,而加了特性的則是枚舉上的相加。這也導致了create=1,read=2,update=4,delete=8的原因,因為兩個狀態的值相加不能等於其中任何一個的值,如果相等的話,那么[Flag]也就失去了使用它的意義(因為給一個用戶賦予進行read和delete操作的權限,如果兩個相加的值等於update,那不亂套了么,所以這里兩個狀態的值相加不能等於其中任何一個的值)。當然這里如果加一個可讀可刪的權限,那么就可以這樣寫了:readAndDelete=10。是不是很靈活!!!
這種用處很大,比如權限、執行狀態等,都可以用一個int型保存到數據庫中,C#中使用枚舉可以處理這個問題。