你什么时候处理GDI +资源?

时间:2010-03-02 09:08:17

标签: .net gdi+

许多GDI +类实现了IDisposable,但我不确定何时应该调用Dispose。我使用new创建的实例或Graphics.CreateGraphics之类的静态方法很清楚。但是属性getter返回的对象呢?我经常写这样的代码:

var oldRgn = g.Clip;
using (var rectRegion = new Region(rectangle))
{
    g.Clip = rectRegion;
    // draw something
}
g.Clip = oldRgn;

我应该在那之后处置oldRgn吗?我的记忆分析器告诉我,如果不这样做,会有一些不受欢迎的实例。在反射器中查看实现至少可以确认getter在每次调用时都显然会创建一个新实例:

// 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 个答案:

答案 0 :(得分:2)

通常,如果类为IDisposable,则必须在不需要对象时调用.Dispose方法。

此外,MSDN库说:

  

修改返回的Region对象   由Clip属性不影响   随后使用Graphics绘图   宾语。要更改剪辑区域,   用a替换Clip属性值   新的区域对象。

这意味着,您必须处置oldRgn