Флаги перечисления и побитовые операции против «строки битов»
Один из разработчиков предложил нам сохранить выбранные дни недели в виде строки из 7 символов, состоящей из 1 и 0, то есть «1000100» для понедельника и пятницы. Я предпочел (и настоятельно предложил) решение с перечислением Flags и побитовыми операциями, я думаю, что это более чистый способ сделать это, и его должно быть легче понять для других разработчиков.
[Flags()]
public enum Weekdays : int
{
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64
}
Однако, когда я начал реализовывать пример решения, я понял, что, возможно, простой строковый подход все-таки проще: конечно, битовая строка более очевидна, чем «17», если вы просто просматриваете данные. И я нахожу побитовые операции C # нелогичными и чрезвычайно многословными:
Weekdays workDays = Weekdays.Monday | Weekdays.Tuesday;
if ((workDays & Weekdays.Monday) == Weekdays.Monday)
{...}
Конечно, это можно было бы красиво обернуть в методы расширения, но затем мы неожиданно получаем по крайней мере такое же количество строк кода, что и в случае строкового решения, и я с трудом могу утверждать, что побитовый код легче читать.
При этом, я все еще пошел бы с перечислением флагов и побитовыми операциями. Ключевые преимущества, о которых я могу подумать:
Лучшая производительностьМеньше места необходимо для храненияТак как же продать побитовое решение моим коллегам? Нужно ли мне? Каковы другие преимущества использования этого метода перед строками? После завершения примера проекта я обнаружил, что команда все еще выбрала решение на основе строк. Мне нужны лучшие / более сильные аргументы. Почему вы должны использовать перечисления Flags, а не простые битовые строки?