Enum Flags 使用
在了解使用,Flags之間,先demo 無Flags的enum
enum
enum UserAccess
{
none = 0,
CanRead = 1,
CanWrite = 2,
CanModify = 4,
CanDelete = 8
}
接下來用for迴圈跑1~15,並且轉型成UserAccess
for (int i = 0; i < 16; i++) { UserAccess value = (UserAccess)i; Console.WriteLine(value); }
結果
可以看到,enum有宣告的值,會自動顯示enum宣告的字串,
例如3 在UserAccess沒有宣告,則不會轉成enum的字串。
msdn上的說明
The example shows the difference in behavior when a range of integers,
including integers that do not represent underlying values of the enumeration type,
are cast to the enumeration type and their string representations displayed.
For example, note that 3 cannot be represented as a SingleHue value
because 3 is not the underlying value of any SingleHue member.
接下來就要介紹Flags的功能了
我在enum 多一個 [Flags]的Attribute
(在使用Flags之前,有一點要特別注意,enum裡面的值需要二次方的方式給值)
[Flags]
enum UserAccess
{
none = 0,
CanRead = 1,
CanWrite = 2,
CanModify = 4,
CanDelete = 8
}
我們跑同一個迴圈
for (int i = 0; i < 16; i++) { UserAccess value = (UserAccess)i; Console.WriteLine(i + " - " + value); }
結果
我們看3的結果,因為0011 = 0010 OR 0001 (3 = 2 + 1)所以 會等於 CanRead, CanWrite,知道有這個特性後,就可以開始Flags的運用了。
我宣告一個UserAccess vip 有讀取跟寫入權限
寫法 1 使用 OR 運算 0010 | 0001 = 3
寫法 2 直接給值 = 3
說明:寫法1 跟 寫法2 結果是一樣的,只是寫法2要先轉型成UserAccess
用法:要判斷vip 是否有讀取權限 跟 寫入權限 要用 AND 運算的方式
// 寫法 1 UserAccess vip = UserAccess.CanRead | UserAccess.CanWrite; // 寫法 2 UserAccess vip2 = (UserAccess)3; // 0011 (3) & 0001 (1) = 0001 (1) 可讀取 if ((vip & UserAccess.CanRead) == UserAccess.CanRead) { Console.WriteLine("vip有讀取權限"); } // 0011 (3) & 0010 (2) = 0010 (2) 可寫入 if ((vip & UserAccess.CanWrite) == UserAccess.CanWrite) { Console.WriteLine("vip有寫入權限"); }
以上為,enum flags的用法,這功能實在是非常的方便,所以網路上有人將判斷的方法寫成泛型擴充方法
可參考 http://www.codeproject.com/Articles/37921/Enums-Flags-and-C-Oh-my-bad-pun
使用起來就會變成這樣
bool canRead = vip.Has(UserAccess.CanRead)
enum flags 有沒有很方便呢,知道此用法後,接下來就是用運用在實戰上了
下一篇將介紹使用enum flags 怎麼在MVC 建立多個checkbox的運用
參考網址:
https://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx
http://www.codeproject.com/Articles/37921/Enums-Flags-and-C-Oh-my-bad-pun
http://www.dotblogs.com.tw/dotjum/archive/2008/06/22/4356.aspx
http://www.dotblogs.com.tw/chhuang/archive/2008/04/26/3514.aspx
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。