Gotophobia在开关的情况下

Gotophobia在开关的情况下

问题描述:

我有下面的代码: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://*.com/a/11906082/3922214 –

+0

如果你不想在一个单独的方法中封装细节,你可以随时设置布尔标志并在开关后处理处理声明。我真的认为'goto'应该从来没有被包含在C#中,它应该已经被弃用,然后淘汰VB.NET。我在'goto'中遇到的主要问题是它会引起跳跃式的滑动。没有流量。 –

+0

你是否打算默认情况下什么都不做?我知道这类事情的意见是主观的,但我发现你在这里发布的代码很难阅读。 –

任何答案都是猜测和意见。但我相信这是普遍的观点(和写在几个地方的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可能的状态秩序混乱。为什么我不在意别人告诉邻居如果在这里很清楚和容易被忽视。 –

我喜欢我的变种

不喜欢您的变种。当使用它们时,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情况。

,而不是试图迫使你的逻辑变成switch声明,为什么不使用更简单的方法,因为你什么也不做你的不确定状态:

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