C#检查Flags枚举是否仅设置了一个值

时间:2019-05-29 12:59:58

标签: c# enums enum-flags

我有一个function remove() { var p2 = document.getElementById("p2"); p2.parentNode.removeChild(p2); }枚举,并想断言它的给定实例是原始值之一,即它的二进制表示形式恰好具有一个“ 1”,即,它是2的幂。

什么是最好的检查方法?

(我想“最佳”不一定定义明确,所以...)

  • 最快的检查方法是什么?
  • 最语义清晰的检查方式是什么?
  • 如何在编写最少的代码的同时进行检查?

2 个答案:

答案 0 :(得分:0)

使用Framework功能,并且在设置标志的数量方面更加灵活,可以使用以下方式:

[Flags] 
public enum FlagsEnum {
   None = 0,
   One = 1,
   Two = 2,
   Three = 4,
}

void Main()
{
    var flags = FlagsEnum.Two;
    var hasOneElement = Enum.GetValues(typeof(FlagsEnum)).OfType<FlagsEnum>().Where(i => i != FlagsEnum.None && flags.HasFlag(i)).Count() == 1;
}

答案 1 :(得分:0)

位操作将产生最快的结果

((anInstanceOfTheFlaggedEnum & (anInstanceOfTheFlaggedEnum -1)) != 0)

通过更具可读性的内置函数

Enum.IsDefined(typeof(yourFlaggedEnumType), anInstanceOfTheFlaggedEnum)

我刚刚进行了测试,速度快了175倍。