正在考虑另一个问题,并且好奇这两者之间是否存在任何差异(运作或表现)。
假设:
[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) ...
我知道他们做了什么有点明智,我知道HasFlag取代了他们。但Jon Skeet建议使用一个,MSDN文档推荐另一个。
答案 0 :(得分:2)
如果bus
不是2的幂(如果它设置了多个位),并且trip
只设置了其中一些位,(trip & bus) == bus
将为false,但是{{ 1}}将是真的。
答案 1 :(得分:2)
如果您给出的枚举值的值不是2的幂,则第二个选项将返回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
说明:
trip & TransportModes.Plane
为1,显然为!= 0
,但不等于TransportModes.Plane
,其值为5.
但是,如果您不对标志枚举的值使用2的幂,则很可能会出现更大的问题。如果Plane
的值为3,请考虑会发生什么:您无法告诉Bus | Train
和Plane
...