开关盒中的Gotophobia

时间:2016-05-16 19:12:41

标签: c# goto

我有下一个代码:

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还是合理的? 我喜欢我的变体。

3 个答案:

答案 0 :(得分:4)

任何答案都是猜测和意见。但我相信goto的2个可接受用途是普遍意见(以及在互联网上的几个地方写的):

  1. 打破嵌套循环
  2. 通过一个开关盒落到另一个开关盒,因为C#不允许其中包含任何代码的情况下降到下一个条件。
  3. 在您的情况下,您实际上是在应用逻辑并根据条件跳转。 对我来说,这不是goto可接受的用途,应该重构。

    当然,您的代码有效,并且您了解goto周围的负面含义。所以无论你决定什么,都将是一个明智的决定。我会说做出决定,在需要之前不要担心。

答案 1 :(得分:0)

  

我喜欢我的变体

不喜欢你的变体。使用它们时,Gotos是合适的,可以让你编写清晰的代码,而无需编写代码。在这种情况下,我不认为这个标准已得到满足。

  

有人告诉我,最好为“NotPresent”案例定义方法并调用它而不是goto case“Processed”。这是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

分支到一个什么都不做的案例是没有意义的 - 而不是一开始就什么都不做 - 所以我完全删除了"Undefined"。我将“NotPresent”案例移到了“Present”之上,因为这使得这一对让人联想到带有两个案例标签的单个开关部分。

我还删除了curState.ToString()的空案例,但如果重要的是要强调没有其他default值,那么我会保留该案例并添加{{1}使用适当的断言/抛出/记录的情况。

答案 2 :(得分:0)

为什么不使用更简单的方法,而不是试图强迫你的逻辑进入switch语句,因为你对未定义的状态什么都不做:

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