Вопрос What does the [Flags] Enum Attribute mean in C#?не спрашивает, что я спрашиваю, а также не отвечает на него. Если в этом вопросе есть такой ответ, укажите, какой из них (ссылка) в комментариях, а не бездумно и ошибочно помечен как дубликат.Почему MSDN заявляет, что HasFlag * разработан * для работы с FlagsAttribute?
Существует эта записка на MSDN в HasFlag документации:
Метод HasFlag предназначен для использования с типами перечисления, которые помечены с FlagsAttribute атрибут и могут быть использованы для определения того, кратному битовые поля. Для типов перечисления, которые не отмечены атрибутом FlagsAttribute, вызовите метод Equals или метод CompareTo.
Но я тестировал его, и метод работал нормально, несмотря на то, что перечисление отмечено или нет с FlagsAttribute.
Возможно, примечание в документах является попыткой принудительного применения какой-либо * хорошей практики * с использованием атрибута (и это совсем не важно в конце)?
Я взял быстрый взгляд here и в самом деле кажется, что не существует никаких ограничений на перечисление вообще (это только простой побитовое И):
public Boolean HasFlag(Enum flag) {
if (!this.GetType().IsEquivalentTo(flag.GetType())) {
throw new ArgumentException(Environment.GetResourceString("Argument_EnumTypeDoesNotMatch", flag.GetType(), this.GetType()));
}
ulong uFlag = ToUInt64(flag.GetValue());
ulong uThis = ToUInt64(GetValue());
return ((uThis & uFlag) == uFlag);
}
Вся идея Flags не поддерживается ограничениями или валидациями. Все, что '[Flags]', похоже, делает, это включить круговое слияние с ToString и Parse. Итак: Да, это лучшая практика. –
@HenkHolterman, кажется, так; хотел подтвердить здесь. Позор по выбору плохого слова («разработан»). – talles
HasFlag() является чрезмерно дорогим, по крайней мере на порядок медленнее, чем сравнение значения. Код, который вы цитировали, не так, как он работает в .NET 4.5, он был перемещен внутри CLR, чтобы сделать его немного дешевле. Не пишите излишне медленный код. –