Лучшая практика проверки флага enum

Я заметил эти два шаблона для проверки флага enum:

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

Из двух способов проверки флага enum, какой из них лучше w.r.t производительность, читаемость, здоровье кода и любые другие соображения, которые я должен сделать?

Спасибо, Mohammed

Ответ 1

.Net 4 вводит метод HasFlag, который определяет, установлено ли одно или несколько битовых полей в текущем экземпляре, это далеко наилучшая практика:

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

Ответ 2

Я бы выбрал первый вариант:

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

заставляет ясно видеть, что вы проверяете наличие типа Clearance.

Ответ 3

Я бы всегда предпочитал четкую читаемость HasFlag.

Однако из двух вариантов в вопросе я думаю, что !=0 безопаснее, потому что у него нет дублирования. Если вы используете свою альтернативу, то все это слишком просто, когда кодирование подстановки необходимо изменить один из флагов и забыть изменить другое. И тогда вы закончите с этим

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

Ответ 4

Я бы предпочел (type & PurchaseType.CreditCard) != 0, потому что если вы хотите проверить более одного бита, то правая сторона становится громоздкой. Я доверяю битным операциям, что приведенное выше будет истинным только тогда и только тогда, когда бит установлен.