var flag = Week.Monday; flag = flag | Week.Wednesday;
if ((flag & Week.Monday) == Week.Monday )
以上等這些操作是怎么實現的,本章為你講解。
使用場景
有多個判定條件的時候,如果按條件個數傳入參數不是明智之舉。可以使用Flags的枚舉,傳入一個參數解決。
引入Flags
我們知道2進制是可以實現異或等按位運算。默認情況下,枚舉中每個元素的基礎類型都為int,那我們的Enum怎么和2進制掛鈎。
應用 System.FlagsAttribute 屬性可以創建位標志枚舉, 從而實現AND
、OR
、NOT
和 XOR
按位運算。
[Flags] enum Days { None = 0x0, Sunday = 0x1, Monday = 0x2, Tuesday = 0x4, Wednesday = 0x8, Thursday = 0x10, Friday = 0x20, Saturday = 0x40 }
Days
具有 Flags
屬性,且它的每個值都是 2 的若干次冪,指數依次遞增。
FLag | 2進制 | 10進制 | 16進制 |
Sunday | 0000001 (2) | 1 | 0x001 |
Monday | 0000010 (2) | 2 | 0x002 |
Tuesday | 0000100 (2) | 4 | 0x004 |
Wednesday | 0001000 (2) | 8 | 0x008 |
Thursday | 0010000 (2) | 16 | 0x010 |
Friday | 0100000 (2) | 32 | 0x020 |
Saturday | 1000000 (2) | 64 | 0x040 |
按位運算
添加條件:| 操作
flag里面包含星期一與星期三的值
var flag = Week.Monday; flag = flag | Week.Wednesday;
刪除條件:& ~ 操作
flag里面只剩下星期一的值
var flag = Week.Monday | Week.Wednesday; flag = flag & ~Week.Wednesday;
Flag值判斷方法:
按位操作
var flag = Week.Monday | Week.Wednesday; // "flag" 為 "Monday" if ((flag & Week.Monday) == Week.Monday ) { // ... } // "flag" 為"Monday 與 Wednesday" if ((flag & (Week.Monday | Week.Wednesday)) == (Week.Monday | Week.Wednesday)) { // ... } // "flag" 為 "Monday 或者 Wednesday" if ((flag & (Week.Monday | Week.Wednesday)) != 0) { // ... }
或者HasFlag方法
var flag = Week.Monday | Week.Wednesday; // "flag" 為 "Monday" if (flag.HasFlag(Week.Monday)) { // ... } // "flag" 為 "Monday 與 Wednesday" if (flag.HasFlag(Week.Monday) && flag.HasFlag(Week.Wednesday)) { // ... } // "flag" 為 "Monday 或者 Wednesday" if (flag.HasFlag(Week.Monday) || flag.HasFlag(Week.Wednesday)) { // ... }
總算是學會了以前一直想用而不會的東西。