문제

두 개의 깃발이 있습니다.

[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
}
도움이 되었습니까?

해결책

내 깃발을 설정하는 방법은 다음과 같습니다.

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
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top