我什么时候需要在图形上使用dispose()?

时间:2010-07-03 10:27:14

标签: c# user-interface graphics dispose

我正在学习用C#绘制内容,并且我一直看到使用dispose()的建议,但我不太明白它的作用。

  • 我什么时候应该使用dispose() 代码绘制的图形?
  • 如果我发生什么事 别?
  • 我是否需要每次都打电话 时间图形不可见,如此 在具有选项卡和GUI的GUI上 用户切换到另一个选项卡,和 然后在他们切换回来时重新绘制它?
  • 如果我不打电话的话,我会破坏它吗?
  • 蝙蝠侠会逃脱小丑的邪恶魔掌吗?

4 个答案:

答案 0 :(得分:30)

  • 我应该何时在代码绘制的图形上使用dispose()?每当您完成任何实现IDisposable的对象时,您应该只调用Dispose在它有资格进行垃圾收集之前。正如其他人所指出的,最好使用using语句而不是直接调用Dispose
  • 如果我不这样做会怎样?您的程序效率会稍差,因为它会占用比必要资源略多的资源。这是不处理图形的唯一缺点; 但是,不处理其他类实际上可能导致错误(一个着名的例子是StreamWriter)。因此,作为一般规则,最好始终处置任何实现IDisposable的类。
  • 每次图形不可见时是否需要调用它,例如在带有标签的用户界面和用户切换到其他标签的GUI上,然后在切换回来时重新绘制它?不可以。对象只有在完成后才能处理。
  • 如果我不应该打电话,我会破坏它吗?是的。如果在完成对象之前调用Dispose,然后尝试使用已处置的对象,则会得到ObjectDisposedException
  • 蝙蝠侠会逃脱小丑的邪恶魔掌吗?明天收听,同样的蝙蝠时间,同样的蝙蝠通道!

答案 1 :(得分:5)

当您要求图形对象时,Windows将为您分配一些内存。调用dispose会为你整理那些记忆。如果你不调用dispose,所有这些内存句柄都将保持打开状态,最终你的系统将耗尽资源,变慢并最终停止(关闭程序可能会释放它们)。

因为您使用的是.NET,所以当您使用完图形对象后,垃圾收集器最终会为您调用dispose。垃圾收集器的问题是你永远不知道什么时候它会清理对象,所以它可能会使这些资源打开的时间超过必要的时间。

这就是说,你永远不必自己打电话。更好的方法是将对象放在使用范围内:

using(Graphics g)
{
    // do something with the resource
}

现在当你使用范围离开时,对象将被销毁,并且将自动为你调用dispose。您应该将具有dispose方法的所有对象放在使用范围内。

答案 2 :(得分:3)

在noob说话中,Dispose()是关于在使用非托管资源完成后进行清理。

什么是非托管资源?这是CLR无法为您管理的所有内容。它们就像文件句柄,数据库连接,网络套接字,GDI +笔等。您可以通过典型的.NET对象访问这些内容,但它将实现IDisposable,以便您正确清理。

为什么要清理?在您自己清理完之后,该资源将无法供该程序的其他部分使用。在这方面,你正在破坏事物,因为你正在占用资源。

为什么这样做?你应该在你不再需要资源时自己做,而不是依靠垃圾收集器的自动魔法,因为它可能需要很长时间(好吧) ,未指定)垃圾收集器到达之前的时间量。在对象被正确处理之前,您无法重用底层资源,因此您的程序将无法可靠地运行。

答案 3 :(得分:0)

Mitch Wheat says - 总是在任何实现IDisposable的对象上调用Dispose()。图形对象使用的GDI句柄是不受管理的,需要在完成它们时进行处理。

相关问题