gpt4 book ai didi

C# Enum.HasFlag 与按位 AND 运算符检查

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:06 24 4
gpt4 key购买 nike

如果您有一个用于位标志的 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,所以我不知道它在做什么。

最佳答案

使用 HasFlag 会产生性能成本,因为实现会验证您传递的 enum 值是否与标志的类型相同。

消除这种差异,实现高度优化,以避免将较短的类型(例如 byte )提升为 int :

switch (pMTThis->GetNumInstanceFieldBytes()) {
case 1:
cmp = ((*(UINT8*)pThis & *(UINT8*)pFlags) == *(UINT8*)pFlags);
break;
case 2:
cmp = ((*(UINT16*)pThis & *(UINT16*)pFlags) == *(UINT16*)pFlags);
break;
case 4:
cmp = ((*(UINT32*)pThis & *(UINT32*)pFlags) == *(UINT32*)pFlags);
break;
case 8:
cmp = ((*(UINT64*)pThis & *(UINT64*)pFlags) == *(UINT64*)pFlags);
break;
default:
// should not reach here.
UNREACHABLE_MSG("Incorrect Enum Type size!");
break;
}
ReflectionEnum::InternalHasFlag 的源码可以在 here 找到。

尽管成本相对较高,但除了最极端的情况外,它不太可能产生影响。我建议保留它,除非您的分析器指出此调用是您程序中的最大瓶颈。

关于C# Enum.HasFlag 与按位 AND 运算符检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39493944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com