C# 将枚举值声明为~0是否会生成一个';s(按位)?
是否保证C# 将枚举值声明为~0是否会生成一个';s(按位)?,c#,.net,enums,bitwise-operators,C#,.net,Enums,Bitwise Operators,是否保证Test.All将始终包括所有其他值?是的,按位,此枚举值将包括所有其他值。这意味着类似这样的测试: enum Test { X = 1, Y = 1 << 1, Z = 1 << 2, W = 1 << 3, WAndZ = W | Z, All = ~0 } 将对此枚举的所有成员计算为true(即使X的整数值为0) 同样,您可以(也应该)为0设置一个默认值,当与其他标志匹配时,该值将计算为false
Test.All
将始终包括所有其他值?是的,按位,此枚举值将包括所有其他值。这意味着类似这样的测试:
enum Test
{
X = 1,
Y = 1 << 1,
Z = 1 << 2,
W = 1 << 3,
WAndZ = W | Z,
All = ~0
}
将对此枚举的所有成员计算为true(即使X
的整数值为0
)
同样,您可以(也应该)为0
设置一个默认值,当与其他标志匹配时,该值将计算为false:
(Test.All & Test.X) == Test.X
这意味着All
将包括所有标志,None
将不包括标志:
enum Test
{
None = 0, // no flags
X = 1,
Y = 2,
Z = 4,
...
All = ~0 // all flags
}
All
基本上等于设置了所有位的整数。我缺少什么吗?为什么不直接使用-1
?旁白:虽然设置None
作为无标志的标签很有用,但几乎肯定不希望All
标志包含所有可能的值,甚至包括未分配的值。这是因为All
的含义随着每个新标志的设计而有效地改变,对于从未编写过处理它的软件来说。@Rob-那更糟。@shay__;毫无疑问,它是有效的。这只是一种代码气味。例如,微软的BCL永远不会允许在公共API中存在这种不精确性。不过,他们有着极端的标准。
enum Test
{
None = 0, // no flags
X = 1,
Y = 2,
Z = 4,
...
All = ~0 // all flags
}
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);