C#中的goto语句

ief*_*fpw 5 c# goto

我正在写一个像C#一样的函数:

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

          Console.WriteLine("hello " + 1);

          out1:
             string hello = "";
       }
}
Run Code Online (Sandbox Code Playgroud)

这基本上计算数字,如果i大于20,则不应写入console.writeline.它应该跳过并点击"out1"但是"out1"最终需要有一个函数来编译.它需要有"string hello ="""来编译.我不需要"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:
       }
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Eri*_*ert 28

尽管说使用goto有更好的方法来解决这个问题是绝对正确的,但我注意到没有人真正回答过你的问题.

标签必须标记声明.您想要转到没有与之关联的语句的位置.您可以使用单个分号或空块创建空语句.

    out1:
    ;
} 
Run Code Online (Sandbox Code Playgroud)

要么

    out1:
    {}
}
Run Code Online (Sandbox Code Playgroud)

但就像他们说的那样,如果你能避免它,就不要去那里.

  • @Brian:很多人认为这种形式很糟糕; 对空语句的转到更糟糕,并且转到一个空的语句,将两个几乎相同的标点字符放在一起彼此更糟糕.如果可能的话,我会避免这种习语. (9认同)

Ree*_*sey 18

可以通过许多其他方式轻松编写此循环 - 您可以循环而i<=20不是i<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);
   }
}
Run Code Online (Sandbox Code Playgroud)

类似地,break如果在您的实际情况中更合适,您可以使用完全中断循环而不处理更多元素.


Bro*_*ass 10

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

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


Cod*_*aos 5

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

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

你应该只考虑goto以上都不是你想要的.根据我的经验,这种情况很少发生.

看起来你想在continue这里使用.