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

Nik*_*iki 9 .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;
Run Code Online (Sandbox Code Playgroud)

我应该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;
}
Run Code Online (Sandbox Code Playgroud)

我在MSDN中找不到任何相关内容,文档中的示例似乎从未处理过任何内容.

Ker*_*ido 2

一般来说,如果类是,则在不需要该对象时IDisposable必须调用该方法。.Dispose

另外,MSDN 库说:

修改 Clip 属性返回的 Region 对象不会影响后续使用 Graphics 对象进行绘制。要更改剪辑区域,请将 Clip 属性值替换为新的 Region 对象。

这意味着,您必须处置oldRgn.

  • 由于“Brushes.Red”是静态属性,因此您很可能不需要处置该对象。否则,为什么属性会是静态的?这样做是为了保存经常访问的对象以供全局访问和资源重用。这就是这个问题和你最初的问题之间的区别。然而,在出现任何不确定性的情况下,使用 Reflector 总是有意义的。 (2认同)