Когда вы распределяете ресурсы GDI+?
Многие классы GDI+ реализуют IDisposable, но я не уверен, когда мне следует вызывать Dispose. Это понятно для примеров, которые я создаю с new
или статические методы, такие как Graphics.CreateGraphics
, Но как насчет объектов, которые возвращаются получателями свойств? Я часто пишу такой код:
var oldRgn = g.Clip;
using (var rectRegion = new Region(rectangle))
{
g.Clip = rectRegion;
// draw something
}
g.Clip = oldRgn;
Я должен распоряжаться oldRgn
после этого? Мой профилировщик памяти говорит мне, что есть случаи, когда я не могу И, глядя на реализацию в отражателе, по крайней мере, подтверждает, что получатель, очевидно, создает новый экземпляр каждый раз, когда он вызывается:
// Graphics.Clip code from Reflector:
public Region get_Clip()
{
Region wrapper = new Region();
int status = SafeNativeMethods.Gdip.GdipGetClip(new HandleRef(this, this.NativeGraphics), new HandleRef(wrapper, wrapper.nativeRegion));
if (status != 0)
{
throw SafeNativeMethods.Gdip.StatusException(status);
}
return wrapper;
}
Я не смог найти ничего об этом в MSDN, а примеры в документации никогда не показывали ничего.
1 ответ
В общем, если класс IDisposable
Вы должны позвонить .Dispose
метод, когда объект не нужен.
Кроме того, библиотека MSDN говорит:
Изменение объекта Region, возвращаемого свойством Clip, не влияет на последующее рисование с помощью объекта Graphics. Чтобы изменить область клипа, замените значение свойства Clip новым объектом Region.
Что означает, вы ДОЛЖНЫ распоряжаться oldRgn
,