问题是自我解释:
Foo objfoo;
try
{
objfoo = new Foo();
..........
.........
}
catch
{
}
finally
{
objfoo = null;
}
是否有必要释放这样的对象?
答案 0 :(得分:13)
注意:将本地/字段设置为null
不会释放该值。相反,它删除了对值的引用,这可能会或可能不会使它在下一个GC cyle期间可以进行收集。
要回答这个问题,不一定没必要。 JIT`er将计算上次使用本地的时间,并且基本上将本地删除为当时对象的GC根之一。取消当地政策并不会加快这一进程。
Raymond Chen在这个主题上做了一篇很好的文章
答案 1 :(得分:0)
你不需要因为objFoo一旦离开try块就有资格进行垃圾收集(根据你的代码)。 objfoo = null只是将指针设置为null,如果任何其他代码有一个指向该对象的指针,那么它就不会被垃圾收集
答案 2 :(得分:0)
将null
分配给变量不会删除它指向的对象。
您无需担心内存清理。如果您使用.NET,C#将自动为您执行此操作。
答案 3 :(得分:0)
在C#中,通常不是,因为垃圾收集器会释放您的对象。稍后将其设置为null甚至可能会延长其生命周期,因为(取决于编译器如何优化代码),此时仍会引用它。
异常是指对象实现了IDisposable,它应该使用Dispose()方法进行处理。但是你通常将它们包装在使用块中。
答案 4 :(得分:0)
不,没有必要,让CLR完成它的工作。
答案 5 :(得分:0)
除非对象访问非托管资源(文件,网络共享,数据库连接......),否则无需执行此操作,因为一旦它们超出范围,它们将被标记为垃圾回收。
如果他们正在使用资源(例如StreamReader类),则必须自己处理这些对象,但最好通过使用using语句来完成。
答案 6 :(得分:0)
自动垃圾收集意味着您不需要释放内存资源,即使用new创建的对象。
您可能需要释放已分配的其他资源,例如锁定互斥锁以及特定于您自己的项目的上下文,您拥有finally块。
答案 7 :(得分:0)
通常没有必要这样做。如果您的函数即将退出,那么您的对象将自动符合垃圾回收的条件。
但是,如果你有一个非常长的函数,或者它将在 finally 块之后进行一些阻塞操作,那么通过将该变量设置为null,你可以立即使其符合垃圾回收的条件。例如,如果 Foo 管理大量数据,这可能是个好主意。