Когда вы распределяете ресурсы GDI +? - PullRequest
9 голосов
/ 02 марта 2010

Многие классы 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 Ответ

2 голосов
/ 02 марта 2010

Обычно, если класс IDisposable, вы должны вызывать метод .Dispose, когда объект не нужен.

Кроме того, библиотека MSDN сообщает:

Изменение возвращенного объекта Region на свойство Clip не влияет последующее рисование с графикой объект. Чтобы изменить регион клипа, замените значение свойства Clip на новый объект Регион.

Что означает, вы ДОЛЖНЫ распоряжаться oldRgn.

...