返回最后一块......为什么不呢?

时间:2011-04-26 09:00:17

标签: .net try-catch-finally

作为MSDN mentions

  

Finally块中的代码在之后运行   Try或Catch中的Return语句   遇到块,但在此之前   返回语句执行。在这   情况,一个退货声明   最后块在执行之前执行   初始退货声明。这给了一个   不同的回报价值。阻止   这种可能令人困惑的情况,   避免在中使用Return语句   最后阻止。

由于我对本说明书并不了解,我将举一个例子(VB.NET,我认为在C#中情况类似):

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

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

3 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分: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完全相同。

答案 2 :(得分:1)

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