Когда вы распределяете ресурсы 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,

Другие вопросы по тегам