Flags enum против HashSet обычного enum - PullRequest
6 голосов
/ 31 января 2012

Существуют ли веские причины для использования перечисления 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, которые я пропустил и которые оправдывают его использование в "обычном" коде?

Ответы [ 3 ]

7 голосов
/ 31 января 2012

Есть ли некоторые преимущества опции Flags, которые я пропустил

Кроме того, что они на порядки более эффективны? Возможно, это не относится к вам, но это такая очевидная оптимизация, что часто имеет смысл.

Кроме того, если вам не нравится синтаксис битовой операции (и я вас не виню), попробуйте определить методы расширения для их инкапсуляции. Но я бы сказал, что любому компетентному программисту, независимо от его происхождения, в любом случае абсолютно необходимо знать общие битовые операции. Если ваши коллеги озадачены этим использованием, у вас большие проблемы.

1 голос
/ 31 января 2012

как вы знаете, вы можете достичь того же самого с ними обоими.Использование HashSet, вероятно, будет лучшим выбором, если вы хотите хранить данные, поступающие из базы данных, заметных отличий с точки зрения производительности не будет.Наверняка у вас получится гораздо более удобный (и читаемый) код и тип, который лучше подходит для данных, которые вы хотите отсортировать.В обоих случаях вы будете повторять или проверять, присутствует ли значение в вашем контейнере.В то время как Hashset поставляется со всеми типичными для списка расширениями (содержит и т. Д.) С флагами, вам придется самостоятельно реализовать эти функции (например, с помощью пользовательских методов расширения).Результатом будет замедление разработки и менее читаемый код (для ваших коллег :) без каких-либо улучшений. Вот хороший обзор флагов Enum

0 голосов
/ 31 января 2012

Решение HashSet может работать нормально, кроме вопросов эффективности. Но я думаю, что разработчик должен писать правильные коды как можно лучше, а не как приемлемо (другими коллегами), как он мог бы ... Если кто-то недостаточно квалифицирован, чтобы понять ваше ясное и правильное решение, вам не нужно платить за это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...