Вернитесь в блок finally... Почему бы и нет?
Как MSDN упоминает:
Код в блоке finally работает после оператор Return в Try или Catch блок встречается, но до этого Выполняется оператор return. В этом ситуация, оператор возврата в Наконец, блок выполняется до начальный оператор возврата. Это дает другое возвращаемое значение. Предотвращать эта потенциально запутанная ситуация, избегайте использования операторов Return в Наконец блоки.
Как я много не понял из этой заметки, я приведу пример (VB.NET, я думаю, что в С# ситуация похожа):
Try
HugeOp()
Return "OK"
Catch
Return "NOK"
Finally
Return "Finally"
End Try
Теперь почему это должно быть незаконным в С# и VB.NET?
Ответы
Ответ 1
Это незаконно, потому что, когда вы достигаете блока Finally
, значение для возврата уже определено ( "ОК", если все прошло хорошо, "NOK", если было обнаружено исключение). Если вы могли вернуть другое значение из блока Finally
, это значение всегда будет возвращено независимо от результата приведенных выше инструкций. Это просто не имеет смысла...
Ответ 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 для вышеуказанных двух классов точно так же.
Ответ 3
Я думаю, ответ в этом вопросе. Это незаконно, потому что это сбивает с толку. Это не интуитивно понятно, какое значение будет возвращено. Если это незаконно, вы вынуждены писать код, где поток намного яснее.