c# – 空旗是坏习惯吗?

几天前我遇到了一个非常愚蠢的错误.它是由我从第三方库获得的枚举引起的:

[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)}");
}
上一篇:使用C#的Flags特性


下一篇:芯灵思Sinlinx A64开发板 Linux内核等待队列poll ---阻塞与非阻塞