2010-11-24 4 views
6

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

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

Возможный дубликат http://stackoverflow.com/questions/1404769/when-would-dispose-method-not-get-called – SRM 2010-11-24 20:52:52

ответ

0

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

0

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

См: using Statement (C# Reference)

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

5

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

2

Использование расширяется, чтобы попытаться заблокировать блок, так что да, это вызовет Dispose.

2

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

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

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

Заявление usings заменяет необходимость написания такого громоздкое заявления.

using(var connection = new SqlConnection(connectionString)) 
{ 
    // do something with the connection here 
}