这是使用 goto 的安全方法吗?

Is this a safe way to use goto?

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

我知道理想情况下您不想要一种可以 "fail" 的方法,但我正在处理 youtube 数据 API 并且出于某种原因,有些调用只是..不执行.

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

你可能最好使用类似 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 次,然后再继续。

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

大部分程序不用goto就可以表达。在这种特殊情况下,循环是一种更具可读性的构造,因为它几乎表达了您想要表达的内容:

string x;
do {
    x=CanReturnNullSometimes();
} while (x==null);

这个循环的一个好处是读者总是知道它的 post 条件:这个循环可以终止的唯一方法是 x 变为非空。您还可以添加安全检查以确保您没有多次调用该方法。

您的 goto 是安全的,但通常不会被使用。本质上,您已经编写了一个 while 循环的实现。

但是你的代码确实有一个有趣的特性,你的变量可以被限定范围和分配,并且在循环后仍然可用......这可以像这样简洁地完成:-

tryagain: var s = ThisCanReturnNullSometimes();
if (s == null) goto tryagain;

然而,虽然这很有趣....如果您希望它更简洁,我会坚持使用 while 循环或辅助方法

当然,它还有一个额外的问题,就是在一直返回null的情况下会死循环