许多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中找不到任何相关内容,文档中的示例似乎从未处理过任何内容.
一般来说,如果类是,则在不需要该对象时IDisposable
必须调用该方法。.Dispose
另外,MSDN 库说:
修改 Clip 属性返回的 Region 对象不会影响后续使用 Graphics 对象进行绘制。要更改剪辑区域,请将 Clip 属性值替换为新的 Region 对象。
这意味着,您必须处置oldRgn
.