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对象不为null,如果不是,则继续运行方法中的其余代码。对不起,感到困惑。
答案 0 :(得分: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
}
答案 1 :(得分:3)
public void GetData()
{
Foo foo;
while ((foo = bar.GetData()) == null)
bar.addItem("Test");
}
答案 2 :(得分:1)
public void GetData()
{
while(true)
{
Foo foo = bar.GetData();
if(foo == null)
{
bar.addItem("Test");
}
else break;
}
}
答案 3 :(得分: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
}
答案 4 :(得分:1)
你没有使用foo对象,所以你可以摆脱它。
public void GetData()
{
while (bar.GetData() == null)
bar.addItem("Test");
//Use the bar object
}
答案 5 :(得分:-3)
您基本上描述了.Net 4.5中创建的await/async
模式。如果你控制了足够的代码来实现它,那么有问题的代码就变成了这样:
// bar.addItem would need to be done in GetDataAsync if it is important
Foo foo = await bar.GetDataAsync();
最好的答案是@Andrei描述的while循环方法。