[C#]Enum Flags 使用

  • 899
  • 0
  • C#
  • 2016-12-30

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);
}

結果

image

可以看到,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);
}

結果

image

我們看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

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。