Фактическое использование битовых флагов в .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);

Ответ 1

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

FileAccess и FileOptions являются файлами основанные на примерах.

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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 | Отменить | Игнорировать и т.д.

Ответ 5

Есть много примеров в сборках 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()

Ответ 6

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

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