【问题标题】:goto statement in C#C# 中的 goto 语句
【发布时间】:2011-12-05 21:42:26
【问题描述】:

我正在编写一个类似 C# 的函数:

public void CountNumber() 
{
       for(int i = 0; i < 40; i++) {
          if(i > 20) {
               goto out1;
          }

          Console.WriteLine("hello " + 1);

          out1:
             string hello = "";
       }
}

这基本上计算了数字,如果 i 大于 20,则不应写入 console.writeline。它应该跨过并点击“out1”,但“out1”最终需要有一个函数才能编译。它需要有 "string hello = """ 才能编译。我不需要“字符串你好=”“”。我只是希望它什么都不做并结束循环。有没有办法做到这一点,而不需要 out1: 语句需要的“string hello = """?喜欢:

public void CountNumber() 
{
       for(int i = 0; i < 40; i++) {
          if(i > 20) {
               goto out1;
          }

          Console.WriteLine("hello " + 1);

          out1:
       }
}

谢谢。

【问题讨论】:

  • 反转逻辑,扔掉goto
  • 或者不要颠倒逻辑,用break代替goto。
  • 为什么不用for语句从0到20?

标签: c# goto


【解决方案1】:

虽然说有比使用 goto 更好的方法来解决这个问题是绝对正确的,但我注意到实际上没有人回答你的问题。

标签必须标注语句。您想去一个没有与之关联的语句的位置。您可以使用单个分号或空块创建一个空语句。

    out1:
    ;
} 

    out1:
    {}
}

但就像他们说的那样,如果可以避免的话,一开始就不要去那里。

【讨论】:

  • 将其放在一行中是否被认为是不好的形式(例如,out1: ;)?
  • @Brian:很多人认为有一个 goto 是不好的形式;对空语句的 goto 更糟糕,对将两个几乎相同的标点字符相邻的空语句的 goto 更糟糕。如果可能的话,我会避免使用这个成语。
【解决方案2】:

这个循环可以很容易地用许多其他方式编写——你可以只循环 i&lt;=20 而不是 i&lt;40(最好),或者将 Console.WriteLine 调用移动到 if 语句中反转 if 语句。

但是,我假设您正在尝试在“真实”案例中处理更复杂的场景。如果是这种情况,不要使用goto,而是使用continue 跳过循环的其余部分:

public void CountNumber() 
{
   for(int i = 0; i < 40; i++) {
      if(i > 20) {
         continue; // Skips the rest of this loop iteration
      }

      Console.WriteLine("hello " + 1);
   }
}

同样,您可以使用break 来完全跳出循环而不处理更多元素,如果这更适合您的实际情况。

【讨论】:

【解决方案3】:

只需颠倒您的条件 - if...else 也可能是另一种选择。我假设还有其他代码,否则您可以将 for 循环本身更改为最多 20 个。

   for(int i = 0; i < 40; i++) 
   {
      if(i <= 20) 
      {
          Console.WriteLine("hello " + 1);
      }
      //other code
   }

【讨论】:

    【解决方案4】:

    还有一些其他类似 goto 的语句,您应该考虑使用:

    • continue 进入当前循环的下一次迭代。
    • break 离开当前循环
    • return 退出当前方法

    如果以上都不是你想要的,你应该只考虑goto。根据我的经验,这种情况很少见。

    您似乎想在此处使用continue

    【讨论】:

      【解决方案5】:

      您可以为此使用 continue 关键字:

      public void CountNumber()  {
        for(int i = 0; i < 40; i++) {
          if(i > 20) {
            continue;
          }
          Console.WriteLine("hello " + 1);
        }
      }
      

      但是,请考虑改用if

      public void CountNumber()  {
        for(int i = 0; i < 40; i++) {
          if(i <= 20) {
            Console.WriteLine("hello " + 1);
          }
        }
      }
      

      【讨论】:

        【解决方案6】:
        public void CountNumber() 
        {
               for(int i = 0; i < 40; i++) {
                  if(i > 20) {
                      continue;
                  }
        
                  Console.WriteLine("hello " + 1);
        
               }
        }
        

        【讨论】:

        • 也许 for 而不是 foreach?
        • Reed Copsey 和 Guffa 也这样做了 :)
        • @Shymep:奇怪的是每个人都犯了同样的错误 :)
        • @Tigran:一点也不神秘,我们都是从问题中复制代码,并编辑它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多