跳转到最后,不调用返回
本文关键字:调用 返回 最后 | 更新日期: 2023-09-27 18:16:00
在c#中(当使用try/finally时)如何在不调用return的情况下跳转到finally节
例如:public bool SomeMethod()
{
try
{
...
if (...)
{
---> Jump to finally
}
else
{
...
}
...
if (...)
{
---> Jump to finally
}
else
{
...
}
...
return true;
}
finally
{
...
if (...)
return true;
else
return false;
}
}
我怎么能强制跳转到最后一节(不使用返回)?
编辑:我要做的是:
public bool SomeMethod(ref string Error)
{
try
{
bool result = false;
if (...)
---> Exit to Finally
else
...
...
if (...)
---> Exit to Finally
else
...
...
--> more of the above kind of IFs
return true;
}
finally
{
...
if (!result)
{
LogAMessage("");
...
Error = "...";
...
}
return result;
}
}
您可以使用标签和goto
然而,这似乎表明你的函数可能没有很好地组织。
在这种情况下,您似乎正在使用finally
作为函数 -为什么不将该逻辑提取到自己的函数中呢?
您有几个选择:
-
在try/finally块内部或外部添加一个虚拟块,并使用break:
// dummy block inside try { do { ... if (condition) break; ... } while (false); } finally { ... } // dummy block outside do { try { ... if (condition) break; ... } finally { ... } } while (false);
-
在finally块前面添加一个标签,并使用goto(注意一般不建议使用goto)。
-
把你的块放到一个单独的方法中,这样你就可以在不离开外部方法的情况下使用返回
你真的不应该这么做…
考虑重写你的代码,使其不再需要goto -> finally。
也许把finally块中的代码拉到一个方法中,然后在多个地方调用它…
您可以通过以下方式获得所需的行为:
public bool SomeMethod(ref string Error)
{
bool result = false;
try
{
if (...)
{
return result;
}
else
{
result = true;
...
return result;
}
}
finally
{
if (!result)
{
LogAMessage("");
...
Error = "...";
...
}
}
然而,要实现这样的事情,您应该查看委托模式,以获得更清晰的方式来实现此日志记录。
也许可以考虑把这个方法放在一个实现IDisposable
的类中。
然后您可以调用此方法,而它是一个using
语句包装,将保证被清除。