Вернитесь в последний блок ... Почему бы и нет? - PullRequest
17 голосов
/ 26 апреля 2011

Как упоминается в MSDN :

Код в блоке finally выполняется после того, как встречается оператор Return в блоке Try или Catch, но до выполнения этого оператора Return.В этой ситуации оператор Return в блоке Наконец выполняется перед начальным оператором Return.Это дает другое возвращаемое значение.Чтобы предотвратить эту потенциально запутывающую ситуацию, избегайте использования операторов Return в блоках finally.

Поскольку из этой заметки я мало что понял, я приведу пример (VB.NET, я думаю, вВ C # ситуация аналогична):

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

Теперь почему этот нелегальный должен быть как в C #, так и в VB.NET?

Ответы [ 3 ]

25 голосов
/ 26 апреля 2011

Это недопустимо, потому что когда вы достигаете блока Finally, возвращаемое значение уже определено («ОК», если все прошло хорошо, «НОК», если исключение было обнаружено). Если бы вы смогли вернуть значение, отличное от блока Finally, это значение будет возвращаться всегда независимо от результата приведенных выше инструкций. Это просто не имеет смысла ...

2 голосов
/ 28 октября 2011

Мне было любопытно, я использую 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 для двух вышеупомянутых классов абсолютно одинаков.

1 голос
/ 26 апреля 2011

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

...