我有两个标志:
[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
.这既反射(reflect)了默认设置,又让你摆脱了 (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
};
关于c# - 枚举作为标志使用、设置和移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/581555/