Ответ 1
.Net 4 вводит метод HasFlag
, который определяет, установлено ли одно или несколько битовых полей в текущем экземпляре, это далеко наилучшая практика:
type.HasFlag(PurchaseType.CreditCard); // true
Я заметил эти два шаблона для проверки флага 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
.Net 4 вводит метод HasFlag
, который определяет, установлено ли одно или несколько битовых полей в текущем экземпляре, это далеко наилучшая практика:
type.HasFlag(PurchaseType.CreditCard); // true
Я бы выбрал первый вариант:
if ((type & PurchaseType.Clearance) == PurchaseType.Clearance)
{
// Clearance item item handling
}
заставляет ясно видеть, что вы проверяете наличие типа Clearance
.
Я бы всегда предпочитал четкую читаемость HasFlag
.
Однако из двух вариантов в вопросе я думаю, что !=0
безопаснее, потому что у него нет дублирования. Если вы используете свою альтернативу, то все это слишком просто, когда кодирование подстановки необходимо изменить один из флагов и забыть изменить другое. И тогда вы закончите с этим
if ((type & PurchaseType.Clearance) == PurchaseType.CreditCard)
Я бы предпочел (type & PurchaseType.CreditCard) != 0
, потому что если вы хотите проверить более одного бита, то правая сторона становится громоздкой. Я доверяю битным операциям, что приведенное выше будет истинным только тогда и только тогда, когда бит установлен.