2009-02-24 37 views
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 
} 
+0

您的代碼在語法上是正確的,但很難說它是否「好」,而不理解您的問題多一點。你的問題有點含糊,你對答案的評論更是如此。你能再多付一點嗎?表面上你的解決方案對於所提出的問題來說太複雜了。 – Simon 2009-02-24 12:48:08

+0

嗨。有默認值A | B。如果參數-a僅設置爲A的設置模式,如果--b僅限於B,並且兩者都設置爲(默認)A | B。什麼是最好的檢查方法是當前值是默認值(A | B),如果需要將其更改爲A或B. – abatishchev 2009-02-24 13:25:06

回答

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

最後,如果你有很多標誌(而不是僅兩個)的,它可能是更容易設置你的枚舉是這樣的:

[Flags] 
enum Flags 
{ 
    A = 1, 
    B = 1 << 1, 
    C = 1 << 2, 
    D = 1 << 3, 
    E = 1 << 4, 
    F = 1 << 5 
}; 
+0

主要評論是關於默認值是A | B.所以只需使用| =追加是不夠的。 – abatishchev 2009-02-24 12:30:12

2

你可以把一個 「位」 了與下面的精彩發言:

Mode &= ~Flags.A; 

我reccoment inclu在你的枚舉中還有一個「null」值:

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

它會讓你的生活更簡單! :-)

1

第二個版本好多了 - 這正是我要做的。不過,將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 
}