2016-05-16 95 views
0

我有下面的代碼:Gotophobia在開關的情況下

switch (curState.ToString()) 
{ 

    case "Processed": 
     ... *(couple code lines)* 
     break; 
    case "NotPresent": 
     if (someValue == null) 
     { 
       goto case "Undefined"; 
     } 
     goto case "Processed"; 
    case "Undefined": 
     break; 
} 

有人告訴我,這是更好地界定方法「NotPresent」的情況下,並調用它,而不是goto case "Processed"。這是Gotophobia還是合理的? 我喜歡我的變體。

+1

有很多資源,在那裏已經解釋的時候,當不使用'goto'語句。這裏有一個很好的例子:http://stackoverflow.com/a/11906082/3922214 –

+0

如果你不想在一個單獨的方法中封裝細節,你可以隨時設置布爾標誌並在開關後處理處理聲明。我真的認爲'goto'應該從來沒有被包含在C#中,它應該已經被棄用,然後淘汰VB.NET。我在'goto'中遇到的主要問題是它會引起跳躍式的滑動。沒有流量。 –

+0

你是否打算默認情況下什麼都不做?我知道這類事情的意見是主觀的,但我發現你在這裏發佈的代碼很難閱讀。 –

回答

4

任何答案都是猜測和意見。但我相信這是普遍的觀點(和寫在幾個地方的Internet上)的goto 2個可以接受的用途是:

  1. 打破了嵌套的循環
  2. 通過一個開關的情況下下降到另一個,因爲C#沒有按不允許有任何代碼的案例落入下一個條件。

在你的情況,你實際上是應用邏輯和基於條件跳轉。 對我來說,這不是goto的可接受的用途,應該重構。

當然,您的代碼有效,並且您知道goto的負面含義。所以無論你決定什麼都將是一個明智的決定。我會說做出決定,直到需要出現時才放心。

+0

很好的答案,但是#2點並不完全準確,如果一個案例沒有代碼,那麼通過罰款。即'case state1:​​case state2:' – Phaeze

+0

好點,我會澄清。 – Jonesopolis

+0

我非常喜歡你最後一段的想法。但是第一個是這樣的:「那些聰明的人告訴goto只適用於兩種情況」。我得到了描述某些格式內部狀態的規範,並且我按照使用順序從一個到另一個。規範說如果someValue爲null,就像在未定義的情況下一樣,如果nt null像處理過的情況那樣。這是非常清楚的..我不需要魔術與falgs或reodering可能的狀態秩序混亂。爲什麼我不在意別人告訴鄰居如果在這裏很清楚和容易被忽視。 –

0

我喜歡我的變種

不喜歡您的變種。當使用它們時,Gotos是合適的,可以讓你編寫比您無法編寫更清晰的代碼。在這種情況下,我認爲這個標準並沒有得到滿足。

有人告訴我,最好定義方法爲「NotPresent」的情況下,並調用它而不是goto情況下「處理」。這是Gotophobia還是合理的?

你的意思是你被告知這將是更好地定義了"Processed"案件身體的方法,要在這種情況下,無條件地調用和有條件的"Not Present"情況下,從而避免一個goto?我認爲這不會有多大幫助。只要"Processed"箱體只包含一些陳述,我發現它更清楚地保留在switch的身體中。

我自己,我可能會重寫你switch像這樣:

switch (curState.ToString()) 
{ 
    case "NotPresent": 
     if (someValue != null) 
     { 
      goto case "Processed"; 
     } 
     break; 
    case "Processed": 
     ... *(couple code lines)* 
     break; 
} 

有一個在轉移到一個什麼都不做的情況下,是沒有意義的 - 而不是簡單地無所作爲擺在首位 - 所以我刪除那goto一共。我把「Present」之上的「NotPresent」情況移到了「Present」之上,因爲這使得這一對讓人聯想到帶有兩個箱標的單個開關部分。

我也刪除空的情況下"Undefined",但如果它是需要強調指出的curState.ToString()沒有其他價值預期,那麼我反而保留這種情況下,用適當的斷言/投/日誌添加一個default情況。

0

,而不是試圖迫使你的邏輯變成switch聲明,爲什麼不使用更簡單的方法,因爲你什麼也不做你的不確定狀態:

if ((curState.ToString() == "Processed") || 
    ((curState.ToString() == "NotPresent") && someValue != null)) 
{ 
    ... *(couple code lines)* 
}