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)) { // ... }
总算是学会了以前一直想用而不会的东西。
每天成就一小步,积累下来就是一大步。
转发本文请注明出处,谢谢您的阅读与分享!