之前对于枚举的应用很浅,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枚举值
*/