Многие GDI + классы реализуют IDisposable, но я не уверен, когда я должен звонить, Располагают. Это ясно для экземпляров, с которыми я создаю new
или статические методы как Graphics.CreateGraphics
. Но что относительно объектов, которые возвращаются методами get свойства? Я часто пишу код как это:
var oldRgn = g.Clip;
using (var rectRegion = new Region(rectangle))
{
g.Clip = rectRegion;
// draw something
}
g.Clip = oldRgn;
Я, как предполагается, располагаю oldRgn
после этого? Мой профилировщик памяти говорит мне, что существуют не склонные экземпляры, если я не делаю. И рассмотрение реализации в отражателе, по крайней мере, подтверждает, что метод get, по-видимому, создает новый экземпляр каждый раз, когда это вызывается:
// 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, и образцы в документации никогда, кажется, ничего не располагают.
Как правило, если классом является IDisposable
, вы должны вызвать метод .Dispose
, когда объект не требуется.
Кроме того, библиотека MSDN сообщает:
Изменение объекта «Регион», возвращаемого свойством Clip, не влияет на последующее рисование с помощью объекта Graphics . Чтобы изменить область обрезки, замените значение свойства Clip на новый объект "Регион" .
Это означает, что вы ДОЛЖНЫ удалить oldRgn
.