Вызывается ли IDisposeable, если в операторе использования встречается необработанное исключение?

Если у меня есть следующее, будет ли IDisposeable по-прежнему вызываться для DisposeableObject или объект останется открытым, поскольку возникнет необработанное исключение?

using ( DisposeableObject = new Object() )
{
   throw new Exception("test");
}

person Judas    schedule 24.11.2010    source источник
comment
Возможный дубликат stackoverflow.com/ вопросы/1404769/   -  person SRM    schedule 24.11.2010


Ответы (5)


using это как обернуть ваш код в try...finally и удалить в finally, так что да, его нужно вызывать.

person Mike Dour    schedule 24.11.2010

using расширяется до блока try..finally, так что да, он вызовет Dispose.

person Michael Stum    schedule 24.11.2010

В приведенном вами примере Dispose будет вызываться до того, как будет выдано исключение.

Обычный код для обеспечения вызова dispose выглядит следующим образом:

var connection= new SqlConnection(connectionString);
try
{
  // do something with the connection here
}
finally
{
  connection.Dispose();
}

Оператор using заменяет необходимость написания такого громоздкого оператора.

using(var connection = new SqlConnection(connectionString))
{
  // do something with the connection here
}
person Rohan West    schedule 24.11.2010

Согласно MSDN, да. Когда управление покидает область действия оператора using, ожидайте, что оно будет удалено.

person David    schedule 24.11.2010

Объект будет удален, поскольку вы выйдете из области действия, когда всплывет исключение.

См.: использование инструкции (справочник по C#)

Оператор using гарантирует, что Dispose вызывается, даже если во время вызова методов объекта возникает исключение. Вы можете добиться того же результата, поместив объект в блок try, а затем вызвав Dispose в блоке finally; на самом деле именно так оператор using транслируется компилятором.

person Will Marcouiller    schedule 24.11.2010