我正在学习用C#绘制内容,并且我一直看到使用dispose()的建议,但我不太明白它的作用。
答案 0 :(得分:30)
IDisposable
的对象时,您应该只调用Dispose
在它有资格进行垃圾收集之前。正如其他人所指出的,最好使用using
语句而不是直接调用Dispose
。StreamWriter
)。因此,作为一般规则,最好始终处置任何实现IDisposable
的类。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句柄是不受管理的,需要在完成它们时进行处理。