C# 特性(Attribute)之Flag特性


本文參考自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#中使用枚舉可以處理這個問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM