C#中是否像Java一样可以使用“continue to <label>”语句?

4

我需要一个C#版本的Java中的continue语句?

我有以下代码:

for (String b : bar) {
    <label>
    try {
    }
    catch (EndpointNotFoundException ex) {
    continue <label>
    }
  }

我该如何在C#中模拟这种情况?当我遇到异常时,我需要重复执行代码而不是继续执行。


你想尝试相同的值吗?否则只需使用 continue。 - Brian Rasmussen
是的,我需要再次重试该值。 - senzacionale
1
如果你在C#中捕获异常并在catch块中什么也不做,循环将继续到下一个项目 - 就像你的代码一样,它会继续重试相同的项目(并且可能会不断抛出相同的异常)。你确定这是正确的吗? - Dan Puzey
3
焚烧女巫!!把她们烧掉!这片土地上不容许有后藤!再也不能容忍! - Earlz
4个回答

5
为什么不直接添加控制变量呢?
foreach (String b in bar) {
  bool retry;
  do {
    retry = false;
    try {
      // ...
    }
    catch (EndpointNotFoundException ex) {
      retry = true;
    }
  } while (retry);
}

或者

var strings = bar.GetEnumerator<string>();
var retry = false;
while (retry || strings.Next()) {
  var b = strings.Current;
  retry = false;
  try {
    // ...
  }
  catch (EndpointNotFoundException ex) {
    retry = true;
  }
}

5

如果你只需要继续下一个循环迭代,请使用continue

C#还有标签(可以用goto跳转到它们),但请不要使用它们。


5
你忘了补充说goto语句是有害的 :p - Stormenet
3
只有非局部跳转是有害的。C# 不允许非局部跳转。 - Robert Davis
2
continue只是一种特殊类型的goto,因此如果goto确实很邪恶,那么continue也是一种特殊的邪恶(由于限制通常更安全)。每个东西都有其适当的用处和正确的使用方式,包括(很少用到的)goto - jball
1
这是唯一应该使用goto的时候。 - Jonathan Allen
如果我要为goto命名一个“唯一”的情况,那就是显式的穿透 - 在C#中禁止穿透无疑阻止了很多错误,但C语言之所以有它,是有原因的。在C#中,我们可以在另一个case块的末尾使用goto case 2;来执行该块中的代码。不过,我不会完全限制goto。我从谷歌搜索中得知,在C#中使用goto重新进入嵌套循环的开头时,没有其他替代方法。 - Jon Hanna
显示剩余2条评论

5
使用goto <label>;

1
所以goto并不是那么邪恶。感谢您的帮助,我将使用goto <label>。 - senzacionale
5
@senzacionale,“goto”并不是邪恶的,只是非常危险。在C#中存在“goto”并不意味着它是安全的——而你选择的使用方式在多个方面似乎都是不安全的。 - jball

2

我认为你试图做的事情根本不明智 - 你有没有理由期望你不会遇到一个特定迭代总是会抛出异常的情况?

无论如何,如果你想做到不使用goto来实现你想要的功能,请看这个:

foreach (String b in bar) { 
    while(!DidSomethingWithThisString(b))
        ;
  } 

bool DidSomethingWithThisString(string b)
{
    try { 
    } 
    catch (EndpointNotFoundException ex) { 
        return false;
    } 
    return true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接