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

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

Пример

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

using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}

Заметки

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 (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#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

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

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

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

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

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

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

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

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

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