-2

全部——我正在重构一些旧代码,并且正在寻找减少(或者如果不完全消除它)使用 GoTo 语句的方法。我有一段代码如下:

public void GetData()
{
  TryAgain:
      Foo foo = bar.GetData();

      if(foo == null)
      {
          bar.addItem("Test");
          goto TryAgain;
      }

      //Use the bar object
}

将其替换为以下内容:

public void GetData()
{
      Foo foo = bar.GetData();

      if(foo == null)
      {
          bar.addItem("Test");
          GetData();
          return;
      }

      //Use the bar object

}

有什么想法或更好的方法来处理这个问题吗?

更新

首先,这不是我的实际代码,为了简洁起见,我创建了这个片段。接下来请假设一旦向 bar 添加了一个值,那么 IF 语句将被绕过,代码部分将继续并使用 bar 对象。我只想创建一个方法,首先检查以确保 bar 对象不为空,如果不是,则继续运行该方法中的其余代码。对困惑感到抱歉。

4

6 回答 6

9

使用while循环

public void GetData()
{
    Foo foo = bar.GetData();

    while (foo == null)
    {
        bar.addItem("Test");
        foo = bar.GetData();
    }
}

更新。如果我正确理解您的真正目的:

public void GetData()
{
    Foo foo = bar.GetData();    
    if (foo == null)
    {
        bar.addItem("Test");
        // following the assumption
        // "once a value has been added to bar then the IF statement will be bypassed"
        // there is no need for another GetData call - bar object is in valid state now
    }

    //Use the bar object
}
于 2013-06-03T17:16:46.160 回答
3
public void GetData()
{
    Foo foo;    
    while ((foo = bar.GetData()) == null)
        bar.addItem("Test");
}
于 2013-06-03T17:21:01.067 回答
1

你没有使用 foo 对象,所以你可以摆脱它。

public void GetData()
{
    while (bar.GetData() == null)
        bar.addItem("Test");

    //Use the bar object
}
于 2013-06-03T19:24:41.040 回答
1

根据您的更新进行更新,我可能会使用以下代码

public void GetData()
{
    Foo foo = bar.GetData();

    if (foo == null)
    {
        bar.addItem("Test");
        foo = bar.GetData();

        Debug.Assert(foo != null, "Hey, I thought that would give me a value!");
    }

    // do something with foo
}
于 2013-06-03T17:22:42.933 回答
1
public void GetData()
{
  while(true)
 {
      Foo foo = bar.GetData();

      if(foo == null)
      {
          bar.addItem("Test");
      }
      else break;
 }
}
于 2013-06-03T17:17:24.633 回答
-3

您基本上是在描述await/async在 .Net 4.5 中创建的模式。如果你控制了足够多的代码来实现这一点,那么有问题的代码就会变成这样:

// bar.addItem would need to be done in GetDataAsync if it is important
Foo foo = await bar.GetDataAsync();

否则,最好的答案是@Andrei 描述的 while-loop 方法。

MSDN 异步编程

于 2013-06-03T17:38:25.403 回答