理解这个问题的答案需要更深入地了解枚举类的[Flags]属性 . 您可以阅读有关此属性的信息(或阅读有关如何使用它的一些指导原则)here at MSDN
“Flags”属性是C世界的遗留物,你没有C#和CLR给你的所有花哨类型 .
例如,你可能有一个C程序需要跟踪一堆不同的正交条件(我们称之为Condition0,Condition1,Condition2等......)但是为了节省空间,或者为了更容易通过这些条件作为一个单元,我们希望将它们全部塞入一个8位(或更大)值 . 那么你要做的是定义以下条件:
位0跟踪Condition0的状态
位1跟踪Condition1的状态
位2跟踪Condition2的状态
等
如果你还记得你的二进制到十进制转换,你就会知道 - 位0表示十进制值1 - 位1表示十进制值2 - 位2表示十进制值4 - 位4表示十进制值8位 - n表示n的幂的小数值2
因此,我们可以将这两个列表结合起来,看看:
Condition0的值为1(4位二进制为0b0001)
Condition1的值为2(4位二进制为0b0010)
Condition2的值为4(4位二进制为0b0100)
等 . .
如果我们需要表示发生了Condition1和Condition2,那么这意味着设置了位1和位2 . 在二进制中,它是0b0110,在十进制中是“6” . 表示Condition1和Condition2的值只是Condition1和Condition2的逻辑OR . 0b0010或0b0110是0b0110 . 2或4是6 .
现在,您可能已经注意到逻辑OR以及Condition1和Condition2的总和在上面的示例中出