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