是否有必要在try-catch块的最后一个块中释放对象?

时间:2010-12-03 09:20:46

标签: c# try-catch

问题是自我解释:

Foo objfoo;
try
{
  objfoo = new Foo();
  ..........
  .........
}
catch
{

}
finally
{
  objfoo = null;
} 

是否有必要释放这样的对象?

8 个答案:

答案 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 管理大量数据,这可能是个好主意。