foreach (var thing in things)
{
tryagain:
string thing.var1 = ThisCanReturnNullSometimes();
if (thing.var1 == null)
{
goto tryagain;
}
}
我理所当然地知道你不想要一个可以“失败”的方法,但是我正在使用youtube数据API,并且出于某种原因,一些调用只是......不遵循。
这似乎是一种简短而又甜蜜的方式来重新尝试迭代,但我以前从未使用过goto而且我只听过有人说不要使用它。
答案 0 :(得分:4)
大多数节目都可以在没有转到的情况下表达。在这种特殊情况下,循环是一个更易读的结构,因为它几乎说明了你想要它说的内容:
string x;
do {
x=CanReturnNullSometimes();
} while (x==null);
关于这个循环的一个好处是读者总是知道它的后置条件:这个循环终止的唯一方法是x变为非null。您还可以添加安全检查,以确保您没有多次调用该方法。
答案 1 :(得分:0)
您的goto是安全的,但通常不使用。基本上你已经写了一个while循环的实现。
但是你的代码确实有一个有趣的特性,你的变量可以作为范围和分配,并且在循环之后仍然可用...这可以简洁地完成,如: -
tryagain: var s = ThisCanReturnNullSometimes();
if (s == null) goto tryagain;
然而,虽然这很有趣....如果你想要更简洁,我会坚持使用while循环或辅助方法
当然,在null一直返回的情况下,它还有一个无限循环的附加问题。
答案 2 :(得分:-1)
您可能最好使用while
循环之类的东西来监控方法的状态并继续尝试。您可以添加最大迭代检查以确保它不会永远循环。
string thing.var1 = ThisCanReturnNullSometimes();
int iteration = 0;
while (thing.var1 == null && iteration < 5)
{
Thread.Sleep(5000); // sleep for a bit to give the remove service time to "work"
thing.var1 = ThisCanReturnNullSometimes();
iteration++;
}
这将睡5秒然后再次尝试该方法并重复最多5次,然后再继续。
当然,最好的方法是找出你的方法失败的原因,如果这是一个常见的问题或可以解决的问题。