Когда Вы располагаете GDI + ресурсы?

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

9
задан Niki 2 March 2010 в 09:08
поделиться

1 ответ

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

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

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

Это означает, что вы ДОЛЖНЫ удалить oldRgn .

2
ответ дан 5 December 2019 в 02:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: