知道Enum可以用邏輯運算的寫法來讓程式碼的表達更加的簡明清楚,但一直都沒有機會自己實作一下,今天剛好有這方面的需求,因此將寫法陳列在此,以利日後參考。
套用了FlagsAttribute後,Enum就可以開始進行位元等級的邏輯運算了。
[System.Flags] enum Day { //其實不一定要用16進制表示,事實上用int也可以達到一樣的效果,在這邊用16進制只是為了效率罷了 NonDay = 0x00, MON = 0x01, TUE = 0x02, WED = 0x04, THU = 0x08, FRI = 0x10, SAT = 0x20, SUN = 0x40 }
分別可以利用OR(最常使用)、XOR、AND進行運算,其意義在程式碼註解中表示。
static void Main(string[] args) { Day oDay; //加法 oDay = Day.MON | Day.TUE; WriteLine(oDay.ToString()); //MON, TUE //加法(OR) oDay = Day.MON | Day.TUE | Day.FRI | Day.SAT; WriteLine(oDay.ToString()); //MON, TUE, FRI, SAT //減法(XOR) oDay = oDay ^ Day.FRI ^ Day.TUE; WriteLine(oDay.ToString()); //MON, SAT //若存在則留下(AND) oDay = oDay & (Day.MON | Day.TUE | Day.SUN); WriteLine(oDay.ToString()); //MON ReadKey(); }
這樣寫法最棒的點就是OR運算式的寫法,在程式碼中很簡明易了解。另外就是.ToString()方法直接吐出所有存在列舉中日期的字串也是很讚的。在減法(XOR)的使用方式上要小心,如果你試圖去減一個不存在的列舉值,則依據互斥或閘的運算,反而會適得其反的被加上去,這可能會造成程式上的BUG,請多加注意!
需要再多加解釋的是AND的使用方式,後面再帶入一個OR的運算可以用來確認「若存在OOO、XXX則將其保留下來」的運算,若有需要時可以多加利用。
Enum Boolean LogicOperation System.Flags OR XOR AND