.net 枚举标志测试中的差异?
我在看另一个问题,很好奇这两个问题(在操作或性能上)是否有任何区别 鉴于:.net 枚举标志测试中的差异?,.net,enums,.net,Enums,我在看另一个问题,很好奇这两个问题(在操作或性能上)是否有任何区别 鉴于: [Flags] enum TransportModes { None = 0, Bus = 1, Train = 2, Plane = 4 } 和一个变量 var trip = TransportModes.Bus | TransportModes.Train; if((trip&TransportModes.Bus)=TransportModes.Bus). if((trip&Transpo
[Flags]
enum TransportModes
{
None = 0,
Bus = 1,
Train = 2,
Plane = 4
}
和一个变量
var trip = TransportModes.Bus | TransportModes.Train;
if((trip&TransportModes.Bus)=TransportModes.Bus).
if((trip&TransportModes.Bus))!=0).
我知道他们做了些什么,我知道这会取代他们。但是Jon Skeet推荐了一个,MSDN文档推荐了另一个。如果
总线
不是二的幂(如果它有多个位集),并且trip
只有一些位集,(trip&bus)==bus
将为false,但是(trip&bus))!=0将为true。如果您为枚举值指定的值不是二的幂,则第二个选项将返回true。第一个选项没有这个问题
例如:
[Flags]
enum TransportModes
{
None = 0,
Bus = 1,
Train = 2,
Plane = 5
}
var trip = TransportModes.Bus | TransportModes.Train;
if((trip & TransportModes.Plane) != 0)
// will be executed
if((trip & TransportModes.Plane) == TransportModes.Plane)
// won't be executed
说明:
行程和运输模式。飞机为1,显然是!=0,但不等于值为5的TransportModes.Plane
但是,如果不对标志枚举的值使用二的幂,则很可能会出现更大的问题。想想会发生什么,如果Plane
的值为3:你无法区分Bus | Train
和Plane