【发布时间】:2016-09-14 15:08:43
【问题描述】:
如果您有一个用于位标志的enum,即,
[Flags]
internal enum _flagsEnum : byte
{
None = 0, //00000000
Option1 = 1, //00000001
Option2 = 1 << 1, //00000010
Option3 = 1 << 2, //00000100
Option4 = 1 << 3, //00001000
Option5 = 1 << 4, //00010000
Option6 = 1 << 5, //00100000
Option7 = 1 << 6, //01000000
Option8 = 1 << 7, //10000000
All = Byte.MaxValue,//11111111
}
_flagsEnum myFlagsEnum = _flagsEnum.None;
做起来更快吗..
bool hasFlag = myFlagsEnum.HasFlag(_flagsEnum.Option1);
或者去做..
bool hasFlag = myFlagsEnum & _flagsEnum.Option1 != 0
如果检查多个标志之间存在性能差异,那么也要考虑到这一点。
通常我会查看参考源,但在这种情况下,Enum.HasFlags 只是转到外部 InternalHasFlags,所以我不知道它在做什么。
【问题讨论】:
-
有一些性能成本。见:stackoverflow.com/questions/7368652/…
-
似乎过早的优化。我不喜欢
HasFlag的一件事是它接受任何enum对象作为参数,而不是同一类型。 -
HasFlag不仅仅是简单的按位检查blogs.microsoft.co.il/bnaya/2011/01/28/enumhasflag-good-or-bad -
@Yushatak 然后我建议您制作自己的扩展方法来为您的枚举重载
HasFlag()。 -
& 运算符采用单处理器指令 (TEST),在现代 CPU 上运行 0.25 到 1 个处理器周期。它永远不会比调用 CLR 慢。如果您关心速度,那么永远不要使用 byte 作为枚举基本类型,默认 (int) 是最快的。
标签: c# performance optimization enums bit-manipulation