Принцип управления ресурсами RAII в .NET
От: Ignoramus  
Дата: 29.07.06 08:23
Оценка:
Напомню, что это Resource Acquisition Is Initialization — практика оборачивания любого ресурса (память, хендлы и т.д.) непосредственно после его выделения в смарт-обертку, которая освобождает ресурс в своем деструкторе. Это exception-safe метод избежания утечки ресурсов.

Хорошо, что в .NET "память не ресурс" уже, но как быть с другими ресурсами, такими как Pen, Brush, Region и т.д. Их желательно освободить немедленно после использования, а не когда GC захочет.

Можно в конце блока вызывать явно Dispose, но это не exception-safe (до этого может возникнуть исключение). В C# есть конструкция using { } — почти то, что нужно, за тем исключением, что ею неудобно (нельзя?) пользоваться если ресурс выделяется в другой функции.

В этом собственно и вопрос: насколько exception-safe является следующий код:

void Method1()
{
  using( Pen myPen = CreateMyPen() )
  {
   ...
  } // при выходе из блока (в т.ч. по исключению) происходит вызов myPen.Dispose(), очень хорошо :)
}

Pen CreateMyPen()
{
 Pen newPen = new System.Drawing.Pen(...);

 // что если здесь исключение, или даже после return, при приведении типа возвращаемого значения?
 return newPen;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.