.net 何时处置GDI+;资源?

.net 何时处置GDI+;资源?,.net,gdi+,.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 = old

许多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
?我的内存分析器告诉我,如果我不这样做的话,就会有未经处理的实例。查看reflector中的实现至少可以确认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中找不到任何相关信息,文档中的样本似乎从未处理过任何东西

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

此外,MSDN库还指出:

修改返回的区域对象 通过“剪辑”属性不会影响 用图形绘制后续图形 对象要更改剪辑区域, 将剪辑特性值替换为 新区域对象


这意味着,您必须处理
oldRgn

尝试将“g.Clip=oldRgn”移动到using块中。我已经阅读了MSDN段落四次,但仍然看不到连接。同样的道理也可以用在刷子上;getter返回一个一次性对象;修改对象不会影响后续图形。但这是否意味着每次调用getter时都必须处理
brusks.Red
?因为
brusks.Red
是一个静态属性,所以您可能不需要处理对象。否则,为什么属性是静态的?这样做是为了保存一个经常访问的对象,以便全局访问和资源重用。这就是这个问题和你最初的问题之间的区别。然而,在任何不确定的情况下使用Reflector总是有意义的。因此,本质上,没有规则-您必须始终查看源以确定是否必须处理属性getter的结果。在不清楚的情况下押注GC。恐怕是这样,不过还是谢谢你的回答。