Оператор using (Справочник по C#)

Обновлен: Июль 2008

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

Пример

В следующем примере показано, как использовать оператор using.

using (System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Users\Public\Documents\test.txt"))
{
    string s = null;
    while((s = sr.ReadLine()) != null)
    {
        Console.WriteLine(s);
    }
}

Заметки

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

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

Оператор using гарантирует вызов метода Dispose, даже если при вызове методов в объекте происходит исключение. Такого же результата можно достичь при размещении объекта в блоке try и последующем вызове метода Dispose в блоке finally; фактически, это способ преобразования оператора using компилятором. Приведенный ранее пример кода во время компиляции расширяется до следующего кода (при создании ограниченной области действия для объекта обратите внимание на дополнительные фигурные скобки).

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

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

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

Можно создать объект ресурсов, а затем передать переменную в оператор using, однако этот способ не является рекомендованным. В этом случае после того, как элемент управления выводится из блока using, объект остается в области действия, даже если он больше не сможет обращаться к неуправляемым ресурсам. Другими словами, он больше не будет полностью инициализирован. При попытке использовать объект вне блока using возникает риск вызова исключения. По этой причине предпочтительно создать объект в операторе using и ограничить область его действия блоком using.

Font font2 = new Font("Arial", 10.0f);
using (font2) // not recommended
{
    // use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight(); 


Спецификация языка C#

Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:

  • 5.3.3.17 Операторы using

  • 8.13 Оператор using

См. также

Основные понятия

Руководство по программированию в C#

Реализация метода Dispose

Ссылки

Ключевые слова C#

Директива using (Справочник по C#)

Реализация методов Finalize и Dispose для очистки неуправляемых ресурсов

Другие ресурсы

Справочник по C#

Сборка мусора

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

Пример кода добавлен после введения.

Исправление ошибки содержимого.