将枚举值声明为 ~0 是否会生成一个标志(按位)?
Does declaring enum value as ~0 generates a flag of one's (bitwise)?
enum Test
{
X = 1,
Y = 1 << 1,
Z = 1 << 2,
All = ~0
}
是否会生成Test.All
作为按位1的标志,无论在以后的时间点将多少值添加到Test
?例如,如果添加新值:
enum Test
{
X = 1,
Y = 1 << 1,
Z = 1 << 2,
W = 1 << 3,
WAndZ = W | Z,
All = ~0
}
是否保证 Test.All
将始终包含所有其他值?
是的,按位,此枚举值将包括所有其他值。这意味着这样的测试:
(Test.All & Test.X) == Test.X
将对此枚举的所有成员计算为真(即使 X
的整数值为 0
)。
同样,您可以(并且应该)为 0
设置一个默认值,当与其他标志匹配时,它的计算结果为 false:
enum Test
{
None = 0, // no flags
X = 1,
Y = 2,
Z = 4,
...
All = ~0 // all flags
}
这意味着 All
将包含所有标志,而 None
将不包含任何标志:
Debug.Assert((Test.All & Test.None) == Test.None);
Debug.Assert((Test.All & Test.X) == Test.X);
Debug.Assert((Test.All & Test.All) == Test.All);
Debug.Assert((Test.None & Test.None) == Test.None);
Debug.Assert((Test.None & Test.X) == Test.None);
Debug.Assert((Test.None & Test.All) == Test.None);
enum Test
{
X = 1,
Y = 1 << 1,
Z = 1 << 2,
All = ~0
}
是否会生成Test.All
作为按位1的标志,无论在以后的时间点将多少值添加到Test
?例如,如果添加新值:
enum Test
{
X = 1,
Y = 1 << 1,
Z = 1 << 2,
W = 1 << 3,
WAndZ = W | Z,
All = ~0
}
是否保证 Test.All
将始终包含所有其他值?
是的,按位,此枚举值将包括所有其他值。这意味着这样的测试:
(Test.All & Test.X) == Test.X
将对此枚举的所有成员计算为真(即使 X
的整数值为 0
)。
同样,您可以(并且应该)为 0
设置一个默认值,当与其他标志匹配时,它的计算结果为 false:
enum Test
{
None = 0, // no flags
X = 1,
Y = 2,
Z = 4,
...
All = ~0 // all flags
}
这意味着 All
将包含所有标志,而 None
将不包含任何标志:
Debug.Assert((Test.All & Test.None) == Test.None);
Debug.Assert((Test.All & Test.X) == Test.X);
Debug.Assert((Test.All & Test.All) == Test.All);
Debug.Assert((Test.None & Test.None) == Test.None);
Debug.Assert((Test.None & Test.X) == Test.None);
Debug.Assert((Test.None & Test.All) == Test.None);