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

C# 这是使用goto的安全方法吗?,c#,loops,goto,C#,Loops,Goto,我知道理想情况下,您不需要一个可能“失败”的方法,但我正在使用youtube数据API,出于某种原因,一些调用只是。。不要坚持到底 这似乎是重新尝试迭代的一种简短而甜蜜的方式,但我以前从未使用过goto,我只听到人们说不要使用它 您最好使用while循环来监视方法的状态并继续尝试。您可以添加一个最大迭代检查,以确保它不会永远循环 foreach (var thing in things) { tryagain: string thing.var1 = ThisCanReturnN

我知道理想情况下,您不需要一个可能“失败”的方法,但我正在使用youtube数据API,出于某种原因,一些调用只是。。不要坚持到底


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

您最好使用
while
循环来监视方法的状态并继续尝试。您可以添加一个最大迭代检查,以确保它不会永远循环

foreach (var thing in things)
{
    tryagain:
    string thing.var1 = ThisCanReturnNullSometimes();
    if (thing.var1 == null)
    {
        goto tryagain;
    }
}
string thing.var1=thiscanReturnNullTime();
int迭代=0;
while(thing.var1==null&&iteration<5)
{    
Thread.Sleep(5000);//稍微休息一下,让移除服务有时间“工作”
thing.var1=这可以返回null();
迭代++;
}
此操作将休眠5秒钟,然后重试此方法,最多重复5次,然后继续


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

大多数程序都可以不用goto来表达。在这种特殊情况下,循环是一种可读性更高的构造,因为它表达了您希望它表达的内容:

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

这个循环的一个优点是,读者总是知道它的post条件:这个循环可以终止的唯一方式是x变为非null。您还可以添加安全检查,以确保不会多次调用该方法。

您的转到是安全的,但通常不会使用。实际上,您已经编写了while循环的实现

但是您的代码确实有一个有趣的特性,您的变量可以被限定范围和赋值,并且在循环之后仍然可用。。。这可以简单地完成,如:-

string x;
do {
    x=CanReturnNullSometimes();
} while (x==null);
然而,尽管这很有趣。。。。如果您希望更简洁,我会坚持使用while循环或helper方法


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

为什么不是一个while循环呢?它更能传达意图。。。虽然这是null,但get another是“安全的”,但这并不意味着这是个好主意。你想把阅读代码的“每分钟wtf”降到最低,而goto是一个不必要的wtf。有趣的问题是,如果有更多的人知道存在
do while
循环或
goto
:)这比我的方法好,因为你不必给这个方法两次。@KeithNicholas你能定义“安全”吗?在我看来,C#中的所有
goto
都是“安全的”(否则代码将无法编译)。你不能有有效的C代码编译成无法验证的IL,例如…@KeithNicholas goto在你的情况下是安全的。然而,这并不意味着应该将其用于简单的循环,因为可读性受到影响。@dasblinkenlight不是我的情况:)
tryagain: var s = ThisCanReturnNullSometimes();
if (s == null) goto tryagain;