C# 雜記 — 列舉(enum)旗標(Flags)的用法

莊創偉
Sep 2, 2019

--

列舉常常用來記錄狀態,增加程式的可讀性。

比如

用可閱讀的單字來取代魔術數字。

另外 enum 可以宣告為 Flags 來實現狀態疊加與比對。

宣告為 Flagsenum值會判斷為二進制,可以使用二進制的特性(01)配合

運算元(|、^、&)實現狀態疊加與比對。

列印結果會由小到大表示
結果不正確

因為二進制運算元是以0/1false/true 進行比對,所以若不為2的倍數會導致錯誤的結果

若不宣告為[Flags]則結果為單純的數字相加

要比對狀態可使用 &(AND)

if((list & flagList.Friday) == flagList.Friday){
.......................
}

一樣是利用二進制的特性,兩者皆為1才為1,故 (list & flagList.Friday)的結果會等於 flagList.Friday

刪除時可使用 ^(XOR)

if((list & flagList.Friday) == flagList.Friday){
list = list ^ flagList.Friday;
}

記得刪除前先進行比對,否則如果狀態中沒有該值時會變為增加(XOR 兩者相同為否,反之為真)

補充:

使用 enum 時建議給定0的初始值,因為 enum物件建立時值為0,若無設定值為0的選項時,會造成比對不到可對應的值。

但要注意 0 值在使用&比對時會永遠成立。

--

--

莊創偉

學海無涯。但是為了生計還是得下海的風塵男子