在.NET中,是否有一种常见的做法可以更轻松地为垃圾回收器释放内存?
在.NET中,大多数与图形相关的对象(Image及其派生类,Graphics,Pen,Brush等)都实现了IDisposable接口。如果你要使用一个对象进行特定的操作,然后不再使用,可以使用以下模式:
using(var g = Graphics.FromBitmap(bmp)) { //使用图形对象进行一些操作 }
这样做将确保任何非托管资源在其作用域结束时被释放。
然而,他提到了关于内存的问题,而使用IDisposable与内存没有直接关系。
调用Dispose()
方法与内存有关,特别是对于GDI对象(Graphics,Pen,Brush等)。但对于由GC收集的托管内存来说,它的作用很小。
如果他正在进行图像操作,使用IDisposable接口将清理图像句柄和相关内存。
我不使用GDI或任何其他非托管代码。如果我没弄错的话,WPF应该会处理这个问题。
在.NET中,将不再需要的对象分配为null值是否有用?
通常情况下,不是的。大多数在线示例都是来自于VB6转到.NET的人,而在VB6中这是一种常见的最佳实践。在.NET中,这不是很有帮助的。如果你有一个非常长时间运行的方法,这可能会让垃圾收集器稍早地找到该对象 - 但是如果你的方法如此之长,那你有其他问题。
相反,在.NET中,你应该构建短方法,并在尽可能小的作用域块中尽可能晚地定义变量。使用由作用域确定的变量的"自然"生命周期,但是要保持该自然生命周期尽可能短。
你不应该自己进行垃圾回收,正如这里至少有一个答案所建议的那样。这实际上可能会让事情变得更慢。.NET使用分代垃圾收集器。通过强制进行垃圾回收,你可能会收集到目标对象(也可能不会 - 垃圾收集没有任何保证)。但是你可能还会强制收集一堆尚不能收集的其他对象,并将它们存储在更高级别的代中,从而使它们在将来更难收集。所以就别这么做了。
谢谢你的回答!你说将对象分配为null没有用。但这会有什么影响吗?
:如果你做得太晚,它可能会影响性能。而且无论在哪里使用,它都是一种标准的优化。所以不要这样做。