2014-01-07 2 views
3

Вопрос 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); 
} 

Итак, почему на земле не говорится, что он * разработан * для работы с FlagsAttribute, когда на самом деле он не полагается на него?

+4

Вся идея Flags не поддерживается ограничениями или валидациями. Все, что '[Flags]', похоже, делает, это включить круговое слияние с ToString и Parse. Итак: Да, это лучшая практика. –

+0

@HenkHolterman, кажется, так; хотел подтвердить здесь. Позор по выбору плохого слова («разработан»). – talles

+3

HasFlag() является чрезмерно дорогим, по крайней мере на порядок медленнее, чем сравнение значения. Код, который вы цитировали, не так, как он работает в .NET 4.5, он был перемещен внутри CLR, чтобы сделать его немного дешевле. Не пишите излишне медленный код. –

ответ

1

HasFlags только имеет смысл на Flags перечисления. Вам не нужно объявлять перечисление как Flags, но это рекомендуется. Это документация, и она настраивается на флагах ToString форматирование.

MSDN рекомендует либо создать флаги перечисления, отметьте его Flags и использовать HasFlags, или не делать ничего из этого. Не смешивай.

Вот и все это предложение пытается передать. Это подталкивает вас к лучшим практикам. В идеале, была бы ссылка на страницу с объяснением флагов, но это не так, как обычно обрабатывается MSDN (увы). Они в основном говорят вам, что вы можете сделать, а не то, что вы должны делать.

Смежные вопросы