Вернитесь в блок 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

Я думаю, ответ в этом вопросе. Это незаконно, потому что это сбивает с толку. Это не интуитивно понятно, какое значение будет возвращено. Если это незаконно, вы вынуждены писать код, где поток намного яснее.