枚举为标志使用,设置和移位
我有两面旗帜:
[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) { // }
主要预订:可以设置两个标志。 或者只有一个,在这种情况下只执行一部分代码。
我的代码好吗? 设置标志的最佳方法是什么?
更新 :首先,这不是那么难看,你怎么看?
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 }
这是我如何设置我的标志:
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
,这是相当丑陋的,恕我直言。
然后你可以这样设置你的标志:
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 };
您可以使用以下精彩语句关闭“位”:
Mode &= ~Flags.A;
我还会在你的枚举中重新包含一个“null”值:
[Flags] enum Flags { Null = 0; A = 1, B = 2; }
它会让你的生活更简单! 🙂
第二个版本要好得多 – 这正是我要做的。 但是将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 }