我一直在帮助同事调试他们代码中的一些奇怪行为。以下示例说明了这一点:
static void Main(string[] args)
{
string answer = Sample();
Console.WriteLine(answer);
}
public static string Sample()
{
string returnValue = "abc";
try
{
return returnValue;
}
catch (Exception)
{
throw;
}
finally
{
returnValue = "def";
}
}
这个示例代码会返回什么?
你可能会认为由于 finally 代码块的存在,它将返回 "def",但实际上它返回的是 "abc"?我已经逐步执行了代码并确认 finally 代码块确实被调用了。
真正的答案是你不应该一开始就编写这样的代码,但我仍然对其行为感到困惑。
编辑:为了澄清一些答案基础上的流程。
当您逐步运行代码时,在 return 之前会执行 finally 块。
重复:在 try { return x; } finally { x = null; } 语句中到底发生了什么?