Флаги перечисления и побитовые операции против «строки битов»
Один из разработчиков предложил сохранить несколько дней недели в виде 7-символьной строки, равной 1 ’.с и 0s, т.е.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, а не простые битовые строки?