Определение и использование бит-маски в C#
Пример
[Flags] private enum BitmaskEnum { Value1 = 1, Value2 = 2, Value3 = 4, Value4 = 8, Value5 = 16, }
Если вы не укажете числовые значения для перечисляемых имен, перечисление даст им значения 1, 2, 3 и так далее. Если вы хотите, чтобы все имена отображали разные значения, вы должны установить их равными разным степеням 2, как в предыдущем коде. Затем вы можете комбинировать их в любой комбинации с помощью побитовых операторов.
Если вы не укажете числовые значения для перечисляемых имен, перечисление даст им значения 1, 2, 3 и так далее. Если вы хотите, чтобы все имена отображали разные значения, вы должны установить их равными разным степеням 2, как в предыдущем коде. Затем вы можете комбинировать их в любой комбинации с помощью побитовых операторов.
...
Value3and5 = Value3 | Value5,
enum автоматически не делает значения равными степеням из двух, так что вы получаете с помощью атрибута Flags? Атрибут сообщает разработчикам кода и другим программам, что перечисления, отмеченные атрибутом, предназначены для бит-масок. Еще более полезным является тот факт, что он позволяет enum обрабатывать комбинированные значения при вызове метода ToString. Например, рассмотрим следующий код.
NormalEnum normal_value = NormalEnum.Value1 | NormalEnum.Value2; BitmaskEnum bitmask_value = BitmaskEnum.Value1 | BitmaskEnum.Value2;
Каждое из этих операторов делает значение, которое объединяет два других значения. Определение кода NormalEnum совпадает с определением BitmaskEnum, за исключением того, что он не использует атрибут Flags. Оба общих значения: 1 | 2 = 0001 | 0010 = 0011 = 3.
При отображении вызова методов ToString значения, однако, C# знает, что bitmask_value является типом флага, поэтому он отображает его значение соответствующим образом. Следующий текст показывает, как программа отображает два значения.
normal_enum = 3 bitmask_enum = Value1, Value2
Пример программы отображает различные значения в TextBox при запуске. Например, следующий код показывает, как программа отображает значение NormalEnum.Value1.
txtValues.Text = NormalEnum.Value1 + " = " + (int)NormalEnum.Value1 + "\r\n" + ...
Сначала этот оператор отображает само значение. Программа автоматически преобразует ее в текст, поэтому результатом является имя перечислимого значения. Затем код добавляет значение, преобразованное в целое число, а затем новую строку. Код аналогично отображает другие значения.