Это хороший подход для вызова return внутри с помощью оператора {}?
Я просто хочу знать, это безопасный / хороший подход к вызову return
внутри using
блок.
например.
using(var scope = new TransactionScope())
{
// my core logic
return true; // if condition met else
return false;
scope.Complete();
}
мы знаем, что в последний раз самая кудрявая скобка dispose()
будет отменена. Но что будет в приведенном выше случае, так как return
выводит элемент управления из заданной области (AFAIK)...
- мой
scope.Complete()
вам звонил? - и так для области
dispose()
метод.
7 ответов:
это совершенно безопасно позвонить
return
внутриusing
блок, так как блок using-это простоtry/finally
заблокировать.в вашем примере выше после возвращения
true
, область будет удалена и значение возвращается.return false
иscope.Complete()
будет не вам звонил.Dispose
однако будет вызван независимо, так как он находится внутри блока finally.ваш код по существу такой же, как этот (если это облегчает поймите):
var scope = new TransactionScope()) try { // my core logic return true; // if condition met else return false; scope.Complete(); } finally { if( scope != null) ((IDisposable)scope).Dispose(); }
пожалуйста, имейте в виду, что ваша сделка будет никогда commit, поскольку нет никакого способа добраться до
scope.Complete()
для совершения сделки.
это нормально -
finally
предложения (это то, что закрывающая фигурная скобкаusing
предложение делает под капотом) всегда выполняется, когда область остается, независимо от того, как.однако это верно только для операторов, которые находятся в блоке finally (который не может быть явно установлен при использовании
using
). Поэтому в вашем примереscope.Complete()
никогда не будет вызван (я ожидаю, что компилятор предупредит вас о недостижимом коде).
В общем, это хороший подход. Но в вашем случае, если вы вернетесь перед вызовом
scope.Complete()
, Это будет просто мусор TransactionScope. Зависит от вашего дизайна.таким образом, в этом примере Complete() не вызывается, а scope удаляется, предполагая, что он наследует интерфейс IDisposable.
объем.Полный обязательно должен быть вызван до
return
. Компилятор выдаст предупреждение и этот код никогда не будет вызван.о
return
сам - да, это безопасно вызывать его внутриusing
заявление. Использование переводится на try-finally блок За сценой и, наконец, блок должен быть обязательно выполнен.
в приведенном примере есть проблема;
scope.Complete()
никогда не вызывается. Во-вторых, это не очень хорошая практика, чтобы использоватьreturn
инструкцияusing
заявления. Обратитесь к следующей:using(var scope = new TransactionScope()) { //have some logic here return scope; }
в этом простом примере, суть в том, что, значение
scope
будет null, когда использование оператора будет завершено.поэтому лучше не возвращаться внутрь с помощью операторов.
чтобы убедиться, что
scope.Complete()
будет вызван, оберните его сtry/finally
. Элементdispose
называется потому, что у вас есть обернуть его сusing
это альтернативаtry/finally
блок.using(var scope = new TransactionScope()) { try { // my core logic return true; // if condition met else return false; } finally { scope.Complete(); } }