Оператор 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#.
См. также
Ссылки
Директива using (Справочник по C#)
Реализация методов Finalize и Dispose для очистки неуправляемых ресурсов
Основные понятия
Руководство по программированию на C#