23

正如 MSDN提到的

finally 块中的代码在遇到 Try 或 Catch 块中的 Return 语句之后运行,但在该 Return 语句执行之前。在这种情况下,Finally 块中的 Return 语句在初始 Return 语句之前执行。这给出了不同的返回值。为了防止这种潜在的混乱情况,请避免在 finally 块中使用 Return 语句。

由于我对这篇笔记的了解不多,所以我举个例子(VB.NET,我认为在C#中情况类似):

Try
    HugeOp()
    Return "OK"
Catch
    Return "NOK"
Finally
    Return "Finally"
End Try

现在,为什么这在 C# 和 VB.NET 中都是非法的?

4

3 回答 3

32

这是非法的,因为当您到达该Finally块时,要返回的值已经定义(如果一切顺利,则返回“OK”,如果捕获到异常,则返回“NOK”)。如果您能够从Finally块中返回不同的值,则无论上述指令的结果如何,都将始终返回该值。只是没有意义...

于 2011-04-26T09:13:19.380 回答
2

我对此很好奇,我正在运行 VS2010,并且不允许在 finally 块中返回。这是我编译的代码

Public Class Class1
   Public Shared Function test() As String
      Try
         Return "OK"
      Catch ex As Exception
         Return "Catch"
      Finally
         test = "Finally"
      End Try
   End Function
End Class

我编译了 DLL 以查看 MSIL,它看起来很有趣,上面的代码基本上被重构为:

Public Class Class2
   Public Shared Function test() As String
      Try
         Try
            test = "OK"
         Catch ex As Exception
            test = "Catch"
         End Try
      Finally
         test = "Finally"
      End Try

      Return test
   End Function
End Class

并对此进行测试,上述两个类的 MSIL 完全相同。

于 2011-10-28T19:11:37.117 回答
1

我想答案就在问题中。这是非法的,因为它令人困惑。返回哪个值并不直观。如果它是非法的,您将被迫编写流程更清晰的代码。

于 2011-04-26T09:08:45.230 回答