代码之家  ›  专栏  ›  技术社区  ›  Trevor Thorpe

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

  •  1
  • Trevor Thorpe  · 技术社区  · 9 年前
    foreach (var thing in things)
    {
        tryagain:
        string thing.var1 = ThisCanReturnNullSometimes();
        if (thing.var1 == null)
        {
            goto tryagain;
        }
    }
    

    我知道理想情况下,你不希望一个方法会“失败”,但我正在使用youtube数据API,出于某种原因,有些调用只是…不执行。

    3 回复  |  直到 9 年前
        1
  •  4
  •   Sergey Kalinichenko    9 年前

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

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

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

        2
  •  0
  •   Keith Nicholas    9 年前

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

    但是你的代码确实有一个有趣的特点,你的变量可以被作用域和赋值,并且在循环之后仍然可用……这可以简单地像这样做:-

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

    然而,尽管这很有趣……如果您希望更简洁,我还是坚持使用while循环或helper方法

        3
  •  -1
  •   Steve    9 年前

    使用类似于 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次,然后继续。

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