一尘不染

如果我不对笔对象调用Dispose,会发生什么?

c#

如果我不调用此代码片段中Disposepen对象,会发生什么?

private void panel_Paint(object sender, PaintEventArgs e)
{
    var pen = Pen(Color.White, 1);
    //Do some drawing
}

阅读 232

收藏
2020-05-19

共1个答案

一尘不染

Pen会由GC在未来某个不确定的点进行收集,你是否不叫Dispose

但是,GC不会清除笔所拥有的任何非托管资源(例如GDI
+句柄)。GC仅清除托管资源。通过调用Pen.Dispose,您可以确保及时清理这些非托管资源,并且不会泄漏资源。

现在,如果Pen拥有终结器,并且该终结器清除了非托管资源,那么当Pen垃圾被回收时,那些非托管资源将被清理。但是重点是:

  1. 您应该Dispose显式调用以便释放非托管资源,并且
  2. 您不必担心是否有终结器可以清除非托管资源的实现细节。

Pen实施IDisposableIDisposable用于处置非托管资源。这是.NET中的模式。

有关该主题的先前评论,请参见此答案

2020-05-19