Разница между «использованием» и ограничением? - PullRequest
7 голосов
/ 30 октября 2009

В чем разница между следующими двумя фрагментами кода:

using (Object o = new Object())
{
    // Do something
}

и

{
    Object o = new Object();
    // Do something
}

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

Редактировать: Полезные лакомые кусочки, которые я взял из этого:

Джон Скит:

Обратите внимание, что это не приводит к принудительному сбору мусора ни в каком виде, форме или форме. Сборка мусора и быстрая очистка ресурсов несколько ортогональны.

Комментарий Уилла Эддинса:

Если ваш класс не реализует интерфейс IDisposable и не имеет функции Dispose (), вы не используете use.

Ответы [ 5 ]

20 голосов
/ 30 октября 2009

Первый фрагмент вызывает Dispose в конце блока - вы можете делать это только с типами, которые реализуют IDisposable, и он в основном вызывает Dispose в блоке finally, поэтому вы можете использовать его с типами, которые требуется очистка ресурсов, например

using (TextReader reader = File.OpenText("test.txt"))
{
    // Use reader to read the file
}
// reader will be disposed, so file handle released

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

По сути, вы должны использовать оператор using почти для всего, что реализует IDisposable и за что ваш блок кода будет нести ответственность (с точки зрения очистки).

3 голосов
/ 30 октября 2009

Просто, чтобы буквально показать разницу ...

using (FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate))
{
  //stuff with file stream
}

совпадает с ...

{
  FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);

  try
  {
    //stuff with filestream
  }
  finally
  {
    if (fileStream != null)
      ((IDisposable)fileStream).Dispose();
  }
}

где как

{
  FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);
  fileStream.Dispose();
}

как есть.

3 голосов
/ 30 октября 2009

В конце using объект удаляется (объект, который вы помещаете в скобки, должен реализовывать IDisposable). Объект утилизируется и в исключительных случаях. И вам не нужно ждать, пока GC сделает это (вы контролируете это).

РЕДАКТИРОВАТЬ: Недостатком области видимости являются:

  • Вы не контролируете расположение объекта
  • даже если вы вызовете dispose в конце вашей области, это не будет безопасным для исключения
1 голос
/ 30 октября 2009

См. Документацию относительно IDisposable и определяемого освобождения ресурса.

Проще говоря, в конце блока using{} вы можете надежно распоряжаться выделенными ресурсами (например, закрывать дескрипторы файлов, соединения с базой данных и т. Д.)

0 голосов
/ 30 октября 2009

using просто требует реализации интерфейса IDisposable и вызывает метод Dispose в конце области.

Для множества яростных споров о правильной утилизации объектов есть множество других потоков.

...