2010-01-12 6 views

ответ

13

Это означает, что obj реализует IDisposible и будет утилизировать после using блока. Это функционально так же, как:

{ 
    //Assumes SomeObject implements IDisposable 
    SomeObject obj = new SomeObject(); 
    try 
    { 
    // Do more stuff here.  
    } 
    finally 
    { 
    if (obj != null) 
    { 
     ((IDisposable)obj).Dispose(); 
    } 
    } 
} 
+0

ой! Ницца! Спасибо за ответ. – Ricardo

+2

Почти правильно, используя() не подразумевает оператор catch, только try/finally. – Turnor

+0

@ Джей Дэн, как в Графика? Если я использую свою графику внутри оператора «using», мне не нужно будет утилизировать? – Ricardo

5
using (object obj = new object()) 
{ 
    //random stuff 
} 

эквивалентно:

object obj = new object(); 
try 
{ 
    // random stuff 
} 
finally { 
    ((IDisposable)obj).Dispose(); 
} 
+0

Почти эквивалент. В первом примере obj выходит за пределы области действия}. Во-вторых, он все еще находится в сфере охвата. Подобно эквивалентности for-while. –

0

это способ охвата объекта, поэтому метод Dispose вызывается на выходе. Это очень полезно для соединений с базой данных в частности. ошибка компиляции будет возникать, если объект не реализует idisposable

0

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

1

Почему он существует?

Он существует для классов, в которых вы заботитесь о своей жизни, в частности, когда класс обертывает ресурс в ОС и вы хотите немедленно его выпустить. В противном случае вам придется подождать финализаторы CLR (не детерминированные).

Примеры, дескрипторы файлов, соединения DB, подключение розеток, ....

+0

Это синтаксический сахар –

+0

Я не согласен - это хорошо известный образец и поэтому поощряет общую хорошую практику. для цикла тоже синтаксический сахар - но он всегда используется, потому что это распространенная идиома также я пытался объяснить, почему вы ее видите - и почему вы увидите версию без сахара – pm100

Смежные вопросы