Снова о ключевом слове using в C#

Снова о ключевом слове using в C#

При обработке управляемых объектов, реализующих интерфейс IDisposable, вполне типичным будет использование методов структурированной обработки исключений (см. главу 6), чтобы гарантировать вызов метода Dispose() даже при возникновении исключительных ситуаций в среде выполнения.

static void Main(string[] args) {

 MyResourceWrapper rw = new MyResourceWrapper();

 try {

  // Использование членов rw.

 } finally {

  // Dispose () вызывается всегда, есть ошибки или нет.

  rw.Dispose();

 }

}

Этот пример применения технологии "Безопасного программирования" прекрасен, но реальность такова, что лишь немногие разработчики готовы мириться с перспективой помещения каждого типа, предполагающего освобождение ресурсов, в рамки блока try/catch/finally только для того, чтобы гарантировать вызов метода Dispose(). Поэтому для достижения того же результата в C# предусмотрен намного более удобный синтаксис, реализуемый с помощью ключевого слова using.

static void Main(string[] args) {

 // Dispose() вызывается автоматически при выходе за пределы

 // области видимости using.

 using(MyResourceWrapper rw = new MyResourceWrapper()) {

  // Использование объекта rw.

 }

}

Если с помощью ildasm.exe взглянуть на CIL-код метода Main(), то вы обнаружите, что синтаксис using на самом деле разворачивается в логику try/finally с ожидаемым вызовом Dispose().

.method private hidebysig static void Main(string [] args) cil managed {

 …

 .try {

  …

 } // end try

 finally {

  …

  IL_0012: callvirt instance void SimpleFinalize.MyResourceWrapper::Dispose()

 } // end handler

} // end of method Program::Main

Замечание. При попытке применить using к объекту, не реализующему интерфейс IDisposable, вы получите ошибку компиляции.

Этот синтаксис исключает необходимость применения "ручной укладки" объектов в рамки программной логики try/finally, но, к сожалению, ключевое слово using в C# является двусмысленным (оно используется для указания пространств имен и для вызова метода Dispose()). Тем не менее, для типов .NET, предлагающих интерфейс IDisposable, синтаксическая конструкция using гарантирует автоматический вызов метода Dispose() при выходе из соответствующего блока.

Исходный код. Проект SimpleDispose размещен в подкаталоге, соответствующем главе 5.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Снова об интерфейсах и реализациях

Из книги Сущность технологии СОМ. Библиотека программиста автора Бокс Дональд

Снова об интерфейсах и реализациях Цель отделения интерфейса от реализации заключалась в сокрытии от клиента всех деталей внутренней работы объекта. Этот фундаментальный принцип предусматривал уровень косвенности, или изоляции (level of indirection), который позволял


Снова IUnknown

Из книги Давайте создадим компилятор! автора Креншоу Джек

Снова IUnknown IUnknown не имеет реализации по умолчанию, которая являлась бы частью интерфейса системного вызова СОМ. Заголовочные файлы SDK не содержат базовых классов, макросов или шаблонов, предусматривающих реализации QueryInterface, AddRef и Release, которые должны использоваться во


Снова выражения

Из книги Журнал «Компьютерра» № 24 от 27 июня 2006 года автора Журнал «Компьютерра»

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


КАФЕДРА ВАННАХА: Не выразить в слове…

Из книги Linux для пользователя автора Костромин Виктор Алексеевич

КАФЕДРА ВАННАХА: Не выразить в слове… Автор: Ваннах МихаилСтарый НФ-рассказ Айзека Азимова. В высокотехнологичном обществе, давно привыкшем во всем полагаться на компьютеры, пытливый техник делает крупное математическое открытие — открывает таблицу умножения… Мы,


18.9.1 Снова о предосторожностях

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

18.9.1 Снова о предосторожностях В начале этой главы было уже сказано, что одновременное обращение к диску двух разных операционных систем может привести к неприятностям. Но об этом придется напомнить еще раз в связи с только что рассмотренной возможностью получения


Снова о ключевом слове sealed

Из книги Ощупывая слона [Заметки по истории русского Интернета] автора Кузнецов Сергей Юрьевич

Снова о ключевом слове sealed Ключевое слово sealed может также применяться к членам типа, чтобы запретить переопределение таких виртуальных членив в производных типах. Это оказывается полезным тогда, когда нужно изолировать не весь класс, а только несколько его методов или


Снова о роли форматтера .NET

Из книги Феномен науки. Кибернетический подход к эволюции автора Турчин Валентин Фёдорович

Снова о роли форматтера .NET Заключительным элементом головоломки удаленного взаимодействия .NET является форматтер. Типы TcpChannel и HttpChannel используют свои внутренние форматтеры, задачей которых является перевод объекта сообщения в термины соответствующего протокола. Как


1. Снова о хакерах

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран


6.1. Снова о понятиях

Из книги Удвоение продаж в интернет-магазине автора Парабеллум Андрей Алексеевич


И снова неограниченная универсальность

Из книги Цифровой журнал «Компьютерра» № 164 автора Журнал «Компьютерра»

И снова неограниченная универсальность Конечно же, не все случаи универсальности ограничены. Форма - STACK [G] или ARRAY [G] - по-прежнему существует и называется неограниченной универсальностью. Пример DICTIONARY [G, H -> HASHABLE] показывает, что класс одновременно может иметь как


Глава 6. Клиенты, которые покупают снова и снова

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Глава 6. Клиенты, которые покупают снова и снова Начните вести клиентскую базу Большая часть прибыли интернет-магазинов строится на постоянных клиентах, которые совершают регулярные покупки. Однако часто покупатели не возвращаются лишь потому, что забыли про ваш


Ложь навсегда: почему нас обманывают снова и снова Василий Щепетнёв

Из книги Человеческий фактор. Успешные проекты и команды автора Листер Тимоти

Ложь навсегда: почему нас обманывают снова и снова Василий Щепетнёв Опубликовано 17 марта 2013 На днях попалась мне книга с примечательным названием: «Как узнать, что вас опять обманывают». Стояла она на полке магазина не вольно, а запечатанная в


И снова про транзакции

Из книги Инкубатор Twitter. Подлинная история денег, власти, дружбы и предательства автора Билтон Ник

И снова про транзакции Новичков иногда пугает "особенность" IBX закрывать все запросы при подтверждении или "откате" транзакции. Разместим на нашей форме две кнопки, как показано на рис. 2.10: Button 1 (свойство Caption равно Commit) и Button2 (Rollback). Рис 2.10. Кнопки управления