Многие классы 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, и примеры в документации никогда не обнаруживают ничего.