Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 开关箱中的哥特恐惧症_C#_Goto - Fatal编程技术网

C# 开关箱中的哥特恐惧症

C# 开关箱中的哥特恐惧症,c#,goto,C#,Goto,我有下一个代码: switch (curState.ToString()) { case "Processed": ... *(couple code lines)* break; case "NotPresent": if (someValue == null) { goto case "Undefined"; } goto case "Pro

我有下一个代码:

switch (curState.ToString())
{

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

有人告诉我,最好为“NotPresent”case定义方法并调用它,而不是
goto case“Processed”
。这是哥特恐惧症还是合理的?我喜欢我的变体。

任何答案都是猜测和意见。但我相信人们普遍认为(在互联网上的几个地方都有这样的说法)
goto
的两个可接受的用法是:

  • 打破嵌套循环
  • 从一个开关盒跌落到另一个开关盒,因为C#不允许一个带有任何代码的开关盒跌落到下一个状态
  • 在您的例子中,您实际上是在应用逻辑,并根据一个条件跳转对我来说,这对于goto来说是不可接受的,应该进行重构


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

    任何答案都是猜测和意见。但我相信人们普遍认为(在互联网上的几个地方都有这样的说法)
    goto
    的两个可接受的用法是:

  • 打破嵌套循环
  • 从一个开关盒跌落到另一个开关盒,因为C#不允许一个带有任何代码的开关盒跌落到下一个状态
  • 在您的例子中,您实际上是在应用逻辑,并根据一个条件跳转对我来说,这对于goto来说是不可接受的,应该进行重构

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

    我喜欢我的变体

    我不喜欢你的变体。当使用GoTo时,GoTo是合适的,它允许您编写比不使用GoTo时更清晰的代码。我认为这一标准在本案中没有得到满足

    有人告诉我,最好为“NotPresent”case定义方法并调用它,而不是goto case“Processed”。这是哥特恐惧症还是合理的

    您的意思是说,您被告知最好为
    “Processed”
    案例的主体定义一个方法,在该案例中无条件地调用,在
    “Not Present”
    案例中有条件地调用,从而避免一个
    转到
    ?我认为这对事情没有多大帮助。只要
    “Processed”
    的case body只包含一些语句,我发现将它们保留在
    开关的body中就更清晰了

    我自己可能会重写你的
    开关
    ,如下所示:

    switch (curState.ToString())
    {
        case "NotPresent":
             if (someValue != null)
             {
                 goto case "Processed";
             }
             break;
        case "Processed":
             ... *(couple code lines)*
             break;
    }
    
    分支到一个什么都不做的案例是没有意义的——而不是一开始就什么都不做——所以我把这个
    goto
    全部删除了。我把“NotPresent”的盒子移到了“Present”的上面,因为这让我想起了一个带有两个盒子标签的开关部分

    我还删除了
    “Undefined”
    的空大小写,但如果强调不需要使用
    curState.ToString()
    的其他值很重要,那么我将保留该大小写,并添加一个带有适当断言/抛出/日志的
    默认大小写

    我喜欢我的变体

    我不喜欢你的变体。当使用GoTo时,GoTo是合适的,它允许您编写比不使用GoTo时更清晰的代码。我认为这一标准在本案中没有得到满足

    有人告诉我,最好为“NotPresent”case定义方法并调用它,而不是goto case“Processed”。这是哥特恐惧症还是合理的

    您的意思是说,您被告知最好为
    “Processed”
    案例的主体定义一个方法,在该案例中无条件地调用,在
    “Not Present”
    案例中有条件地调用,从而避免一个
    转到
    ?我认为这对事情没有多大帮助。只要
    “Processed”
    的case body只包含一些语句,我发现将它们保留在
    开关的body中就更清晰了

    我自己可能会重写你的
    开关
    ,如下所示:

    switch (curState.ToString())
    {
        case "NotPresent":
             if (someValue != null)
             {
                 goto case "Processed";
             }
             break;
        case "Processed":
             ... *(couple code lines)*
             break;
    }
    
    分支到一个什么都不做的案例是没有意义的——而不是一开始就什么都不做——所以我把这个
    goto
    全部删除了。我把“NotPresent”的盒子移到了“Present”的上面,因为这让我想起了一个带有两个盒子标签的开关部分


    我还删除了
    “Undefined”
    的空大小写,但如果需要强调的是,
    curState.ToString()
    不需要其他值,然后,我将保留该案例,并添加一个带有适当断言/抛出/日志记录的
    默认案例。

    与其尝试将逻辑强制到
    开关
    语句中,为什么不使用更简单的方法,因为您对未定义的状态不做任何操作:

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

    与其试图将逻辑强制转换为
    switch
    语句,为什么不使用更简单的方法,因为您对未定义的状态不做任何操作:

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

    有很多参考资料已经解释了何时以及何时不使用
    goto
    语句。下面是一个很好的例子:如果您不想将细节封装在一个单独的方法中,您可以始终设置布尔标志,并在switch语句之后处理处理。老实说,我认为
    goto
    不应该包含在C#中,它应该被弃用,然后在VB.NET中被淘汰。我对转到的主要问题是它会导致蛙跳。它没有流程。您是否打算让
    default
    案例什么都不做?我知道对这类事情的看法是主观的,但我发现你在这里发布的代码很难阅读。这是你的真实代码吗?还是你的代码比这更复杂?@MatthewWatson甚至没有。我