这是一种使用goto的安全方式吗?

时间:2016-10-25 00:41:00

标签: c# loops goto

foreach (var thing in things)
{
    tryagain:
    string thing.var1 = ThisCanReturnNullSometimes();
    if (thing.var1 == null)
    {
        goto tryagain;
    }
}

我理所当然地知道你不想要一个可以“失败”的方法,但是我正在使用youtube数据API,并且出于某种原因,一些调用只是......不遵循。

这似乎是一种简短而又甜蜜的方式来重新尝试迭代,但我以前从未使用过goto而且我只听过有人说不要使用它。

3 个答案:

答案 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次,然后再继续。

当然,最好的方法是找出你的方法失败的原因,如果这是一个常见的问题或可以解决的问题。