5 августа 2011 г.

Оператор using и освобождение ресурсов

Занимаясь написанием управляемого кода на .NET разработчик может не заботиться об освобождении уже использованных ресурсов. За него это делает сборщик мусора. Но что делать, если объект пользуется неуправляемыми ресурсами (изображения, соединение с БД)?

Любой управляемый объект, которые содержит в себе ссылки на неуправляемые  ресурсы, должен реализовывать интерфейс IDisposable, который предоставляет метод Dispose(). Этот метод позволяет освободить используемые объектом неуправляемые ресурсы.

Примером такого объекта является экземпляр класса Bitmap. Воспользуемся следующей конструкцией для работы с подобным объектом:

using (Bitmap PictureBitmap = new Bitmap("c:\\test.jpg"))
{
   // здесь выполняем все нужные нам операции с данными объектом
}

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

Bitmap PictureBitmap = null;
try
{
   PictureBitmap = new Bitmap("c:\\test.jpg");
   // здесь выполняем все нужные нам операции с данными объектом
}
finally
{
  if(PictureBitmap != null)
  {
      PictureBitmap.Dispose();
  }
}

По понятным причинам, лучше не использовать using внутри другой конструкции try - catch - finally.

Комментариев нет:

Отправить комментарий