Enum как использование флагов, настройка и перемещение
У меня есть два флага:
[Flags]
enum Flags
{
A = 1,
B = 2
};
Я устанавливаю их так:
Mode = Flags.A | Flags.B; // default value
for(int i = 0; i < args.Length; i++) {
switch(args[i])
{
case "--a":
{
if ((Mode & Flags.A) == Flags.A && (Mode & Flags.B) == Flags.B)
// both, default assume
{
Mode = Flags.A; // only A
}
else
{
Mode |= Flags.A; // append A
}
break;
}
case "--b":
{
if ((Mode & Flags.A) == Flags.A && (Mode & Flags.B) == Mode.B)
{
Mode = Flags.B;
}
else
{
Mode |= Flags.B;
}
break;
}
} }
и используйте их позже следующим образом:
if((Mode & Flags.A) == Flags.A)
{
//
}
if((Mode & Flags.B) == Flags.B)
{
//
}
Основное резервирование: оба флажка могут быть установлены. Или только один, в этом случае выполняется только одна часть кода.
Хороший ли мой код? Каков наилучший способ установки флагов?
Upd:
Неужели это менее уродливое, чем первое, как вы думаете?
Mode = 0; // default value now is empty
for(int i = 0; i < args.Length; i++) {
switch(args[i])
{
case "--a":
{
Mode |= Flags.A;
break;
}
case "--b":
{
Mode |= Flags.B;
break;
}
} }
if(Mode == 0)
{
Mode = Flags.A | Flags.B; // if no parameters are given, setup both flags
}
Ответы
Ответ 1
Вот как я бы установил свои флаги:
Mode = 0;
for(int i = 0; i < args.Length; i++) {
switch(args[i]) {
case "--a":
Mode |= Flags.A;
break;
case "--b":
Mode |= Flags.B;
break;
}
}
Если оба флага должны быть включены по умолчанию, я думаю, что имеет смысл изменить параметры командной строки на что-то вроде --not-a
и --not-b
. Это отразится на настройке по умолчанию и позволит вам избавиться от (Mode & Flags.A) == Flags.A && (Mode & Flags.B) == Flags.B
, что довольно уродливо, IMHO.
Затем вы можете установить свои флаги следующим образом:
Mode = Flags.A | Flags.B;
for(int i = 0; i < args.Length; i++) {
switch(args[i]) {
case "--not-a":
Mode &= ~Flags.A;
break;
case "--not-b":
Mode &= ~Flags.B;
break;
}
}
Наконец, если у вас много флагов (вместо двух), может быть проще настроить ваше перечисление следующим образом:
[Flags]
enum Flags
{
A = 1,
B = 1 << 1,
C = 1 << 2,
D = 1 << 3,
E = 1 << 4,
F = 1 << 5
};
Ответ 2
Вы можете отключить "бит" со следующим замечательным утверждением:
Mode &= ~Flags.A;
Я бы рекомендовал, включая значение "null" в вашем перечислении:
[Flags]
enum Flags
{
Null = 0;
A = 1,
B = 2;
}
Это упростит вашу жизнь!: -)
Ответ 3
Вторая версия намного лучше - это именно то, что я буду делать. Измените Mode == null
на Mode == 0
, хотя.
Mode = 0; // default value now is empty
for(int i = 0; i < args.Length; i++) {
switch(args[i])
{
case "--a":
Mode |= Flags.A;
break;
case "--b":
Mode |= Flags.B;
break;
}
}
if(Mode == 0)
{
Mode = Flags.A | Flags.B; // if no parameters are given, setup both flags
}