几天前我遇到了一个非常愚蠢的错误.它是由我从第三方库获得的枚举引起的:
[Flags]
public enum MyStatus
{
OKResponse = 0,
ResponseTooBig = 1,
ErrorMessage = 2,
NoResponse = 4,
...
}
我习惯用这种方式检查标志:
if ((status & MyStatus.OKResponse) != 0) {...}
但它不适用于MyStatus.OKResponse,因为它为零.它根本不是一面旗帜,它缺少所有旗帜.当然,当我发现错误时,我意识到OKResponse是唯一的非错误状态,所以它实际上意味着“没有错误,没有标志”.但是,我真的不觉得这很明显.
将标志枚举中的值定义为0是一个坏习惯吗?推荐的方式是什么?检查标志的最佳方法是什么,也可以使用“无标志”标志?
解决方法:
Is it a bad habit defining 0 as one of values in flags enum?
不,相反,正如评论所说,通常使用0作为给定标志的值,并且如果没有为第一个给定值分配不同的值,则枚举将默认为.正如其他人在评论中所说的那样,使用Enum.None作为枚举的第一个值也是很常见的,这使得你的意图对于阅读代码的其他人来说更清晰.
What is the recommended way?
没有办法做到这一点,但我通常喜欢使用简洁的Enum.HasFlag
方法:
void Main()
{
var status = MyStatus.ResponseTooBig | MyStatus.NoResponse;
if (status.Equals(MyStatus.OKResponse))
Console.WriteLine("Status is OKResponse");
else
Console.WriteLine($"Has NoResponse?: {status.HasFlag(MyStatus.NoResponse)}");
}