Который из:
using (var myObject = new MyClass())
{
try
{
// something here...
}
catch(Exception ex)
{
// Handle exception
}
}
ИЛИ
try
{
using (var myObject = new MyClass())
{
// something here...
}
}
catch(Exception ex)
{
// Handle exception
}
c#
try-catch
using-statement
Xaqron
источник
источник
}
указано .using
finally
метод dispose.Ответы:
Я предпочитаю второй. Также могут ловить ошибки, связанные с созданием объекта.
источник
try
блоке, что позволяет вывести сообщение об ошибке в случае сбоя, программа теперь имеет возможность восстановить и сообщить пользователю.using( DBConnection conn = DBFactory.getConnection())
которую необходимо откатить в случае возникновения исключительной ситуации. Мне кажется, что у обоих есть свое место.Поскольку использование блока - это просто упрощение синтаксиса try / finally ( MSDN ), лично я хотел бы пойти на следующее, хотя я сомневаюсь, что он значительно отличается от вашего второго варианта:
источник
finally
блока предпочтительнее, чемusing
утверждение?finally
блока, который удаляет объект IDisposable, - это то, чтоusing
делает оператор. Лично мне нравится это вместо встроенногоusing
блока, потому что я думаю, что он более четко указывает, где все происходит, и что все это на одном и том же «уровне». Мне также нравится это больше, чем несколько встроенныхusing
блоков ... но это все только мои предпочтения.try
оператора, чтобы его можно было разместить вfinally
операторе; в противном случае он выдаст ошибку компилятора: «Использование неназначенной локальной переменной myObject»Cannot assign null to implicitly-typed local variable
;) Но я знаю, что вы имеете в виду, и лично я бы предпочел это вложению блока использования.Это зависит. Если вы используете Windows Communication Foundation (WCF),
using(...) { try... }
он не будет работать правильно, если прокси вusing
операторе находится в состоянии исключения, т.е. удаление этого прокси вызовет другое исключение.Лично я верю в минимальный подход к обработке, т. Е. Обрабатывать только те исключения, которые вам известны в момент исполнения. Другими словами, если вы знаете, что инициализация переменной
using
может вызвать конкретное исключение, я оберну егоtry-catch
. Точно так же, если внутриusing
тела что-то может произойти, что не имеет прямого отношения к переменной inusing
, то я обертываю это другимtry
для этого конкретного исключения. Я редко используюException
в моемcatch
ES.Но мне нравится,
IDisposable
и,using
хотя, возможно, я предвзят.источник
Если вашему оператору catch нужно получить доступ к переменной, объявленной в операторе using, то внутри - ваш единственный вариант.
Если вашему оператору catch требуется объект, на который ссылается использование, перед его удалением, то внутри - ваш единственный вариант.
Если ваш оператор catch выполняет действие неизвестной продолжительности, например, выводит сообщение пользователю, и вы хотели бы распоряжаться своими ресурсами до того, как это произойдет, тогда лучшим вариантом будет внешний.
Всякий раз, когда у меня есть сценарий, похожий на этот, блок try-catch обычно находится в другом методе дальше по стеку вызовов от использования. Для метода нетипично знать, как обрабатывать исключения, возникающие внутри него, вот так.
Таким образом, моя общая рекомендация - снаружи - далеко снаружи.
источник
Оба являются допустимым синтаксисом. Это действительно сводится к тому, что вы хотите сделать: если вы хотите отлавливать ошибки, связанные с созданием / удалением объекта, используйте второй. Если нет, используйте первый.
источник
Здесь я упомяну одну важную вещь: первая не поймает никаких исключений, возникающих при вызове
MyClass
конструктора.источник
С C # 8.0 я предпочитаю использовать второй такой же, как этот
а потом
источник
Если объект, который вы инициализируете в блоке Using (), может выдать какое-либо исключение, вам следует перейти ко второму синтаксису, в противном случае оба одинаково действительны.
В моем сценарии мне пришлось открыть файл, и я передавал filePath в конструкторе объекта, который я инициализировал в блоке Using (), и он мог выдать исключение, если filePath неправильный / пустой. Так что в этом случае второй синтаксис имеет смысл.
Мой пример кода: -
источник
Начиная с C # 8.0 , вы можете упростить
using
операторы при некоторых условиях, чтобы избавиться от вложенного блока, а затем он просто применяется к включающему блоку.Таким образом, ваши два примера могут быть сведены к:
И:
Оба из которых довольно ясны; и затем это сокращает выбор между этими двумя аспектами, и зависит от того, какой вы хотите области действия объекта, где вы хотите обрабатывать ошибки создания экземпляра и когда вы хотите избавиться от него.
источник