简体   繁体   中英

goto statement in C#

I'm writing a function like in C#:

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

          Console.WriteLine("hello " + 1);

          out1:
             string hello = "";
       }
}

This basically counts the number and if the i is greater than 20 it should not write to console.writeline. it should step over and hit "out1" but the "out1" needs to have a function in the end to compile. It needs to have "string hello = """ to compile. I don't need the "string hello = """. I just want it to do nothing and got the end of the loop. Is there a way to do this without the "string hello = """ that the out1: statement needs? Like:

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

          Console.WriteLine("hello " + 1);

          out1:
       }
}

Thanks.

Though it is absolutely correct to say that there are better ways to solve this problem than to use goto, I note that no one has actually answered your question.

A label must label a statement . You want to go to a location that has no statement associated with it. You can either make an empty statement with a single semicolon, or an empty block.

    out1:
    ;
} 

or

    out1:
    {}
}

But like they say, don't go there in the first place if you can avoid it.

This loop could easily be written many other ways - you could just loop while i<=20 instead of i<40 (best), or move the Console.WriteLine call into the if statement with the if inverted.

However, I'm assuming you're trying to work with a more elaborate scenario in your "real" case. If that's the case, instead of using goto , just use continue to skip the rest of the loop:

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);
   }
}

Similarly, you can use break to completely break out of the loop and not process more elements, if that's more appropriate in your real case.

Just invert your condition - also if...else might be an alternative. I assume there is other code otherwise you can just change the for loop itself to just count up to 20.

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

There are some other goto-like statements, you should consider using:

  • continue goes to the next iteration of the current loop.
  • break leaves the current loop
  • return exits the current method

You should only consider goto if none of the above does what you want. And in my experience that's very rarely the case.

It looks like you want to use continue here.

You can use the continue keyword for that:

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

However, consider using the if instead:

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

          Console.WriteLine("hello " + 1);

       }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM