Фактическое использование битовых флагов в.NET Framework

Рассматривалось, как перечисления могут использоваться в качестве битовых флагов путем их украшения с помощью атрибутов flags и операторов bitwize (см. Ниже).

Есть ли какие-либо места в.NET Framework, в которых используется этот шаблон? Мне это нравится, но я хочу увидеть еще несколько примеров из жизни

[Flags]
enum Days2 : int
{

  None = 0x0,
  Sunday = 0x1,
  Monday = 0x2,
  Tuesday = 0x4,
  Wednesday = 0x8,
  Thursday = 0x10,
  Friday = 0x20,
  Saturday = 0x40
}

  Days2 meetingDays = Days2.Tuesday | Days2.Thursday;

  // Set an additional flag using bitwise OR.
  meetingDays = meetingDays | Days2.Friday;

  Console.WriteLine("Meeting days are {0}", meetingDays);

6 ответов

Решение

Да - посмотри на MethodBase.Attributes например, сказать, является ли член публичным, статическим и т. д.

FileAccess а также FileOptions это файловые примеры тоже.

Если вы откроете отражатель, найдите FlagsAttribute а затем нажмите "Анализ" (Ctrl-R) и разверните "Используется", вы увидите множество типов, использующих его. Хотя это занимает некоторое время:)

Одно из самых распространенных перечислений [Flags], которое вы увидите, - это перечисление regex options. Вот пример:

Regex rxInsensitive = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b",
          RegexOptions.Compiled | RegexOptions.IgnoreCase);

Подробнее здесь: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx

Несколько лет назад я написал руководство по использованию битовых перечислений в.Net, может быть, это поможет: http://www.johnsample.com/articles/BitwiseEnums.aspx

Есть много мест, где FlagsAttribute используется для перечислений в BCL.

Вот один пример - BindingFlags параметр, используемый в коде отражения.

Как насчет установки параметров стиля шрифта, таких как:

this.Font = new Font(this.Font, FontStyle.Bold | FontStyle.Italic);

Есть множество мест, которые он использует, он используется в.NET Framework в атрибутах файлов, я видел его в качестве флагов безопасности, т.е.

enum Roles
{
    None = 0,
    User = 1,
    Admin = 2,
    Superman = 4
}

if (_user.Roles & Roles.Admin != Roles.None) { user-is-admin }
if (_user.Roles & Roles.Superman != Roles.None) { user-is-also-superman }

Они в основном хороши для любого сценария, где у вас есть выбор возможных атрибутов для чего-либо, если у вас есть что-то, что может быть выбором цветов, например, выбором этнических групп или т. Д.

Другое распространенное место для их просмотра - диалоговые окна winforms имеют атрибуты, состоящие из них, вы можете или их вместе для окна сообщения, чтобы решить выбор кнопок, которые вы получаете, как Ok | Отмена | Игнорировать и т. Д.

Существует множество примеров в сборках mscorlib и System, хотя вопрос о том, сколько вы встретите в повседневном использовании, является более сложным вопросом.

Например, System.Threading.ThreadState представляет собой комбинацию текущего состояния потока и ожидающих запросов.

Я на самом деле выкинул все перечисления флагов в System и mscorlib, просто для хихиканья, а затем начал искать интересные:

    Dim types = (From t In Reflection.Assembly.GetAssembly(GetType(Int32)).GetTypes() Select t).Concat( _
                (From t In Reflection.Assembly.GetAssembly(GetType(Uri)).GetTypes() Select t))

    For Each t As Type In types
        If t.IsEnum AndAlso (From att In t.GetCustomAttributes(True) Where TypeOf (att) Is FlagsAttribute).Any() Then
            Console.WriteLine("Flag Enum: {0}", t.ToString())
        End If
    Next
    Console.ReadLine()
Другие вопросы по тегам