MSDN 声明如下:
bool Enum.HasFlag(Enum enum)
{
return (thisInstance & enum) == enum;
}
问题:为什么将按位“AND”的结果与所需的标志进行比较,如果你可以这样做:
return (thisInstance & enum) != 0;
或像这样:
return (bool)(thisInstance & enum);//так не работает в С#
避免显式/隐式类型转换?(但使用按位运算,仍然存在到 Int32 或 Int64 的隐式转换)
只是这在任何地方都没有解释,但这个问题很有趣,因为在所有示例中(甚至是 HasFlag 的手动实现 - 无处不在 (thisInstance & enum) == enum )。
所以我想知道由于一些内置的 CLR 函数,性能是否更高,还是优化更好?
我们目前正在创建重复代码!!(好吧,如果我们谈论的话)
首先,您给出的是规范,而不是实现。因此,这里的任何优化考虑都没有任何意义。
现在让我们找出与原始标志和零的比较通常有何不同。但它们在复合标志的情况下有所不同:
与 0 的比较检查是否设置了至少一个位,与标志的比较检查是否设置了所有位。
所以:
也就是说,每个等于 1 in的位都
flag
必须对应一个位 1 incurrent instance
。Current instance
可能有额外的位等于 1,它们不影响结果。因此:thisInstance & flag
应该等于flag
。例如,简化 8 位。
thisInstance = 11000011, flag = 11000000
. 结果应该是true
,因为 中的每个单位flag
对应于中的一个单位thisInstance
。thisInstance & flag = 11000000
,即等于flag
。