【发布时间】:2010-11-10 20:42:45
【问题描述】:
有没有更好的方法来编写这段代码而不使用goto?这似乎很尴尬,但我想不出更好的方法。我需要能够执行一次重试尝试,但我不想复制任何代码。
public void Write(string body)
{
bool retry = false;
RetryPoint:
try
{
m_Outputfile.Write(body);
m_Outputfile.Flush();
}
catch (Exception)
{
if( retry )
throw;
// try to re-open the file...
m_Outputfile = new StreamWriter(m_Filepath, true);
retry = true;
goto RetryPoint;
}
}
【问题讨论】:
-
对不起,无法抗拒! xkcd.com/292
-
总有更好的方法来编写没有 goto 的逻辑。
-
@McWafflestix:我不同意。在一些非常罕见的情况下,使用
goto实际上会产生更清晰的代码——打破嵌套循环是一个经常被引用的例子(因为C# 没有像Java 那样的标记中断)。请参阅stackoverflow.com/questions/2542289/… 了解更多信息。 -
@Heinzi:好的,你的意思是:对于非常糟糕的代码的某些条件,使用 goto 可以产生更清洁的代码;不过,我会将其归类为一种气味,而且是一种特别糟糕的气味。
-
@McWafflestix:而且很容易修复。它通常表示方法中嵌套深度过大。