10

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

[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   
    }
}

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

谢谢,穆罕默德

4

4 回答 4

17

.Net 4 引入了一种HasFlag方法来确定当前实例中是否设置了一个或多个位字段,这是迄今为止的最佳实践:

type.HasFlag(PurchaseType.CreditCard);  // true
于 2012-05-13T19:04:00.740 回答
2

我会选择第一个:

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

因为它清楚地表明您正在检查Clearance类型是否存在。

于 2012-05-13T19:03:12.583 回答
1

我个人总是更喜欢HasFlag.

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

if ((type & PurchaseType.Clearance) == PurchaseType.CreditCard)
于 2012-05-13T19:59:14.493 回答
1

我更喜欢(type & PurchaseType.CreditCard) != 0,因为如果你想检查不止一位,那么右手边就会变得很麻烦。我相信位操作只有当且仅当位被设置时,上述内容才会成立。

于 2012-05-13T20:45:15.107 回答