枚举位域标识符[Flags]

之前对于枚举的应用很浅,Flag标识符遇到过,但并没有自己写过。

这次需要做一个信息分级的工作,于是简单参考了一下MSDN帮助文档,整理一下自己觉得有用的提示。


枚举代码如下:

[Flags]
public enum InfoType
{
    //用 2 的幂(即 1、2、4、8 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠 —— MSDN

    /// <summary>
    /// 错误。
    /// </summary>
    Error = 0x01,
    /// <summary>
    /// 信息。
    /// </summary>
    Information = 0x02,
    /// <summary>
    /// 成功。
    /// </summary>
    Success = 0x04,
    /// <summary>
    /// 失败
    /// </summary>
    Failed = 0x08,
    /// <summary>
    /// 警告
    /// </summary>
    Warning = 0x10,
    /// <summary>
    /// 完成
    /// </summary>
    Completed = 0x20,

    /// <summary>
    /// 异常类型。
    /// </summary>
    Exception = 0x40,
    /// <summary>
    /// 非异常类型,包含所有的非Exception类型的消息
    /// </summary>
    NotException = Error | Information | Success | Failed | Warning | Completed
}

FlagsAttribute 和枚举准则

使用 2 的幂作为枚举的标志

用 2 的幂(即 1、2、4、8 等)定义枚举常量。 这意味着组合的枚举常量中的各个标志都不重叠。例如以下代码

InfoType infoType = 0;
if(...)
{
    infoType |= InfoType.Error;
}
if(...)
{
    infoType |= InfoType.Exception;
}

 这样在调试过程中,你能直观地看到infoType这一枚举变量中含有哪些枚举值了。否则数值是乱的,对应的枚举值也是乱的。

多种类型枚举值

请考虑为常用标志组合创建一个枚举常量。 例如,上面的代码中,NotException类型包含了多种类型枚举值,所以用OR运算符连接起来。

谨慎使用负数

将负数定义为标志枚举常量时应谨慎,这可能使代码产生混淆并易于发生代码错误。

测试枚举变量

测试数值中是否已设置标志的一种简便方法为:在数值和标志枚举常量之间执行按位"与"操作,这种方法会将数值中与标志不对应的所有位都设置为零,然后测试该操作的结果是否等于该标志枚举常量。如下:

InfoType infoType = InfoType.Error|InfoType.Warning|InfoType.Failed;

if((infoType & InfoType.Error) == InfoType.Error)
{
    Console.WriteLine("含有Error枚举值");
}
else
{
    Console.WriteLine("不含有Error枚举值");  
}

if((infoType & InfoType.Exception) == InfoType.Exception)
{
    Console.WriteLine("含有Exception枚举值");
}
else
{
    Console.WriteLine("不含有Exception枚举值");  
}

/*
    含有Error枚举值
    不含有Exception枚举值
*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值