Существуют ли веские причины для использования перечисления Flags (т. Е. Битовой маски) над обычным перечислением HashSet?Насколько я могу судить, обе они решают одну и ту же проблему:
enum Color { Red, Green, Blue }
[Flags()]
enum Colors { None = 0, Red = 1, Green = 2, Blue = 4 }
void Test()
{
// initialization
var supportedColors1 = new HashSet<Color> { Color.Red, Color.Green };
var supportedColors2 = Colors.Red | Colors.Green;
// comparison
if (supportedColors1.Contains(Color.Green)) { /* ... */ }
if ((supportedColors2 & Colors.Green) != 0) { /* ... */ }
// manipulation
supportedColors1.Remove(Color.Red);
supportedColors2 ^= Colors.Red; // if I'm sure that Red is contained
supportedColors2 &= ~Colors.Red; // if I'm not sure
}
Это может быть делом вкуса, но для кого-то, у кого нет аппаратного или системного переворачивания фона (= мои коллеги), Я думаю, что опция Set более читабельна.Я вижу преимущество опции «Флаги», когда требуется микрооптимизация (лучшая производительность, меньше памяти) или когда P / Invoking Windows API, но для стандартных приложений баз данных для бизнеса у меня возникает желание выбрать опцию Setдля удобства чтения.
Есть ли какие-то преимущества опции Flags, которые я пропустил и которые оправдывают его использование в "обычном" коде?