作为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中都应该是非法的?
答案 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)
我想答案就在于问题。这是非法的,因为它令人困惑。将返回哪个值并不直观。如果它是非法的,你被迫编写流程更清晰的代码。