3

私は2つのフラグを持っています:

[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)
{
 //
}

メジャー予約: 両方のフラグが設定される場合があります。または、1 つだけ、この場合、コードの一部のみが実行されます。

私のコードは良いですか?フラグを設定する最良の方法は何ですか?

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ます--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;
    }
}

最後に、(2 つだけではなく) 多数のフラグがある場合は、次のように列挙型を設定する方が簡単な場合があります。

[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

2 番目のバージョンの方がはるかに優れています。これはまさに私がやりたいことです。に変更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 に答える