Предлагает ли оператор using закрывать или уничтожать объекты? - PullRequest
3 голосов
/ 05 февраля 2009

Если я использую что-то вроде:

using (OdbcConnection conn = new OdbcConnection(....))
{
  conn.open();
  my commands and sql, etc.
}

Должен ли я сделать conn.close (); или оператор using не позволяет мне сделать этот последний вызов? Располагает ли он всем в блоке using? Например, если бы я назвал другие объекты неродственными, он бы тоже автоматически дозировал их?

Спасибо. Мне было неясно после прочтения об использовании на сайте Microsoft. Я хочу убедиться, что у меня нет утечек памяти.

Ответы [ 3 ]

6 голосов
/ 05 февраля 2009
  1. Использующий блок избавится от OdbcConnection.
  2. Обычные правила области видимости работают для всего, что объявлено внутри блока using.
  3. Блок using не будет очищать любые другие IDisposable объекты. Это только убирает заявленный предмет
    • обратите внимание, что вы можете вкладывать, используя блоки, или если элементы одного типа, несколько элементов могут быть инициализированы одновременно.

См. Верхний бит моего другого ответа для Как использовать ключевое слово using в C # для получения дополнительной информации.

Я должен также упомянуть, что вы можете закрыть (удалить) соединение, как только закончите с ним, чтобы освободить ресурс. В рекомендациях говорится, что вызывающая сторона должна иметь возможность повторно вызывать метод dispose. Блок using по сути является просто сетью безопасности и позволяет в большинстве случаев писать более понятный код.


[Изменить] например множественная инициализация при использовании: инициализируйте более одного объекта в одном и том же использовании без необходимости вложения блоков, если объекты одного типа:

using (Bitmap b1 = new Bitmap("file1"), b2 = new Bitmap("file2")) 
{ ... }

Джоэл Коухорн упомянул укладку, которая является вложением, но пропускает фигурные скобки, так же как вы можете опустить фигурные скобки в выражении for или if. Пользовательский интерфейс не переформатируется с отступом. Мне было бы любопытно, как выглядит IL.

using(Bitmap b = new Bitmap("filex"))
using(Graphics g = Graphics.FromImage(b))
{ 
}

Ошибочно использовать разные объекты, используя error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement.

// error CS1044
using(Bitmap b = new Bitmap("filex"), Graphics g = Graphics.FromImage(b)) 
4 голосов
/ 05 февраля 2009

Оператор using будет обрабатывать вызовы методов Close и Dispose для вас.

Скотт Хансельман довольно неплохо объясняет использование оператора.

1 голос
/ 05 февраля 2009

Оператор using обеспечивает удаление объекта, реализующего IDisposable. Он будет располагать только тем объектом, на который есть ссылка в блоке using, поэтому ваш код в основном эквивалентен:

OdbcConnection conn = new ....;
try
{
   conn.open();
   conn.....
}
finally
{
   conn.dispose();
}
...