3

我有两个标志:

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

3 回答 3

8

这是我设置标志的方式:

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如果默认情况下这两个标志都应该打开,我认为将命令行参数更改为类似and更有意义--not-b。这既反映了默认设置,又让你摆脱了(Mode & Flags.A) == Flags.A && (Mode & Flags.B) == Flags.BIMHO,这是相当难看的。

然后你可以像这样设置你的标志:

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
};
于 2009-02-24T12:26:44.580 回答
2

您可以使用以下精彩语句关闭“位”:

Mode &= ~Flags.A;

我建议在你的枚举中包含一个“null”值:

[Flags]
enum Flags
{
  Null = 0;
  A = 1,
  B = 2;
}

它会让你的生活更简单!:-)

于 2009-02-24T12:29:14.450 回答
1

第二个版本要好得多——这正是我会做的。改为虽然Mode == nullMode == 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
}
于 2009-02-24T14:00:48.583 回答