Я столкнулся с очень тупой ошибкой несколько дней назад. Это было вызвано это перечисление, я получаю от библиотеки третьей стороной:Является ли пустой флаг плохой привычкой?
[Flags]
public enum MyStatus
{
OKResponse = 0,
ResponseTooBig = 1,
ErrorMessage = 2,
NoResponse = 4,
...
}
Я привык проверять флаги так:
if ((status & MyStatus.OKResponse) != 0) {...}
, но он не работает для MyStatus.OKResponse
, поскольку она равна нулю , Это вовсе не флаг, это отсутствие всех флагов. Конечно, когда я нашел ошибку, я понял, что OKResponse
был единственным статусом ошибки, поэтому на самом деле это означает «нет ошибок, никаких флагов». Тем не менее, я действительно не считаю это очевидным.
Это плохая привычка, определяющая 0 как одно из значений в перечислении флагов? Каков рекомендуемый способ? Каков наилучший способ проверить флаги, которые будут работать с флагом «без флагов»?
не только это не вредная привычка, наоборот - это плохо нЕ определить нулевое значение. Это связано с тем, что значение по умолчанию для перечисления равно 0. Соглашением является его «Нет». Кроме того, при использовании '[Flags]' соглашение заключается в плюрализации имени перечисления. Похоже, ваше перечисление должно называться чем-то вроде «Ошибки». –
Кажется неправильным использование перечисления Flags для этого. У вас есть статус, который представлен более чем одним битом? – Steve
@Steve Да, мне пришлось немного анонимизировать пример ... Первый - это OKResponse, а остальное - некоторые флаги ошибок, более чем один из возможных. Использование флажков в порядке, действительно. – vojta