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