깃발로 열거, 깃발을 사용하고 설정 및 이동합니다
문제
두 개의 깃발이 있습니다.
[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
}
제휴하지 않습니다 StackOverflow