云中客

梦想有多大,就能走多远

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
var flag = Week.Monday;
flag = flag | Week.Wednesday;
if ((flag & Week.Monday) == Week.Monday )

以上等这些操作是怎么实现的,本章为你讲解。

使用场景

有多个判定条件的时候,如果按条件个数传入参数不是明智之举。可以使用Flags的枚举,传入一个参数解决。

引入Flags

我们知道2进制是可以实现异或等按位运算。默认情况下,枚举中每个元素的基础类型都为int,那我们的Enum怎么和2进制挂钩。

应用 System.FlagsAttribute 属性可以创建位标志枚举, 从而实现ANDORNOT 和 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))
{
    // ...
}

总算是学会了以前一直想用而不会的东西。

posted on 2019-02-19 10:18  走遍江湖  阅读(1875)  评论(0编辑  收藏  举报