2013-05-03 63 views
1

我想知道在這些情況下有什麼更好的解決方案,或者編碼標準在公司中對此有何評論?哪個是雙向if-else語句的最佳/標準做法

 if (this.State == NetworkState.Server) 
     { 
      //... 
     } 
     else if (this.State == NetworkState.Client) 
     { 
      //... 
     } 
     else 
     { 
      //some error throwing or printing 
     } 

 if (this.State == NetworkState.Server) 
     { 
      //... 
     }   
     else 
     { 
      //sure its client here 
     } 

我覺得第一個是更具可讀性,因爲你可以清楚地看到,客戶是其他國家,但它也使代碼較長,有時我能」在第三種情況下,真正做得比打印「絕不應該發生」要多得多。有沒有一個更好的解決方案?

+0

如果你正在處理一個枚舉,你不能確保'Client'處於'else'塊的價值,因爲你可以收到有問題的枚舉值無效。您可以使用'switch'語句而不是使用'if/else',並在'default'子句中引發異常。 – Lee 2013-05-03 20:59:38

+0

@Lee即使枚舉只有兩個值,如這裏? – Innkeeper 2013-05-03 21:00:46

+0

從現在開始,當有人向您的代碼中引入新的NetworkState.SomethingElse時會發生什麼? – 2013-05-03 21:03:08

回答

9

這裏使用switch語句更有意義。

switch(this.State) 
{ 
    case NetworkState.Server: 
     //... 
     break; 
    case NetworkState.Client: 
     //... 
     break; 
    default: 
     //some error throwing or printing 
     throw new NotSupportedException(string.Format("An unsupported enumeration value {0}.{1} was used. Processing for the case is not supported because it has not been explicitly implemented.", typeof(NetworkState).Name, this.State), new NotImplementedException()); 
} 

它使事實明確指出,您正在考慮的唯一條件是枚舉值。如果使用if語句,則必須閱讀每個附加的「if」以確保沒有其他影響邏輯的條件。

編輯:我剛剛注意到你的問題的一部分,詢問如何處理不匹配的情況。我在那裏解釋了這個問題。我喜歡這樣做,因爲在現實中 - 我唯一會遇到default條款的唯一情況是:(1)我忘記了一個選項,並且需要實施它;或者(2)自從寫入原始代碼以來已將值添加到枚舉中。在這兩種情況下,開發人員注意力是需要的,而不是處理,所以它似乎拋出一個錯誤,指出這種必要性將是唯一的理性迴應。

+1

'默認'是最重要的 - 通過在這裏拋出/報告錯誤,您可以檢測到已添加新枚舉值並且未更新代碼來處理它的情況。 – 2013-05-03 21:04:04

+0

我現在看到原因,謝謝。開關最老的建議,所以這被接受。 – Innkeeper 2013-05-03 21:08:18

+0

@JasonWilliams - 查看更新。 – smartcaveman 2013-05-03 21:09:54

1

我覺得這些選項的最佳組合是:

if (this.State == NetworkState.Server) 
    { 
     //... 
    }   
    else // State == Client 
    { 
     //... 
    } 
2
switch(this.State) 
{ 
    case NetworkState.Server: 
    ... 
    default: throw new ArgumentException(); 
} 

它使之更加安全,以防有人又增加了NetworkState,不知道這個方法。

0

這取決於。當值只能是布爾值時,if else總是更好。

這是醜陋的:

if (true){ 
    [...] 
else if (false){ 
    [...] 
else{ 
    // can never happen 
} 

這是更好的:

if (true){ 
    [...] 
else{ 
    [...] 
} 

但在使用if看起來可能是最好的辦法枚舉的情況。就像你說的,很高興知道每個branch的枚舉值。我認爲switch語句解決了這個問題。

switch(this.State){ 
    case NetworkState.Server: 
    [...] 
    break; 
    case NetworkState.Client: 
    [...] 
    break; 
    default: 
    // if this can't happen, how about throwing an exception? 
} 
0

如何使用switch case語句?

switch(this.State) 
{ 
    case NetworkState.Server: 
    //... 
    break; 

    case NetworkState.Client: 
    //... 
    break; 

    default: 
    //some error throwing or printing 
}