枚举为标志使用,设置和移位

我有两面旗帜:

[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 }