检查枚举标志的最佳做法

时间:2012-05-13 18:58:25

标签: c# .net enums enum-flags

我注意到这两种模式用于检查枚举标志:

[Flags]
public enum PurchaseType
{
    None = 0,
    SalePrice = 2,
    RegularPrice = 4,
    Clearance = 8,
    CreditCard = 16
}

public void Test()
{
    PurchaseType type = PurchaseType.Clearance;
    type |= PurchaseType.CreditCard;

    // Practice 1
    if ((type & PurchaseType.Clearance) == PurchaseType.Clearance)
    {
        // Clearance item handling
    }

    // Practice 2
    if ((type & PurchaseType.CreditCard) != 0)
    {
        // Credit card item handling   
    }
}

在检查枚举标志的两种方法中,哪一种更好w.r.t性能,可读性,代码健康以及我应该做的任何其他考虑?

谢谢, 穆罕默德

4 个答案:

答案 0 :(得分:15)

.Net 4引入了一个HasFlag方法,用于确定当前实例中是否设置了一个或多个位字段,这是最佳实践:

type.HasFlag(PurchaseType.CreditCard);  // true

答案 1 :(得分:2)

我会选择第一个:

if ((type & PurchaseType.Clearance) == PurchaseType.Clearance)
{
    // Clearance item item handling
}

明确表示您正在检查Clearance类型的状态。

答案 2 :(得分:1)

我个人总是更喜欢HasFlag的清晰可读性。

但是,在问题的两个选项中,我认为!=0更安全,因为它没有重复。如果你使用替代方案,那么当维护编码改变其中一个标志而忘记改变另一个标志时,这很容易。然后你最终得到了这个

if ((type & PurchaseType.Clearance) == PurchaseType.CreditCard)

答案 3 :(得分:1)

我更喜欢(type & PurchaseType.CreditCard) != 0,因为如果你想检查多个位,那么右手边会变得很麻烦。我相信位操作,只有在设置了位时,上述操作才会成立。