是C#中必需的析构函数?

时间:2014-04-12 06:20:53

标签: c# .net

我有一个担忧。我是计算机科学的一年级学生。通常我在课堂上很好奇但是,并不总是我的老师有答案,或者不总是知道答案。 C#中是否需要析构函数?我的意思是,如果我必须像通常使用构造函数那样实现析构函数方法,这是一个好习惯还是我可以避免它,垃圾收集器会为我做这个?

3 个答案:

答案 0 :(得分:13)

析构函数(或终结函数)在语言中很好用 - 但你几乎永远不会使用它们。基本上,如果你在非托管资源上有一个直接句柄,你应该只需要它们,这不仅非常罕见,而且使用SafeHandle作为一个微小的间接层是一个更好的想法无论如何(为您处理清理工作)。有关详细信息,请参阅Joe Duffy's blog post on the topic

对于它的价值,我不记得上次我写一个终结器,而不是测试一些奇怪的行为或其他。

在绝大多数时间里,生活更简单:

  • 垃圾收集器可以处理内存资源清理
  • 如果您在方法中本地使用非托管资源(例如文件),请使用using语句确保在完成后将其释放
  • 如果您需要在类型中引用非托管资源(或实现IDisposable的任何其他内容)作为实例变量,则您的类型本身应实现IDisposable。 (我尽可能避免这种情况。即使 是必要的,你也可以通过上课sealed来简化生活,此时你至少不需要担心其他具有更多非托管状态的子类需要清理。)

答案 1 :(得分:3)

C#中不需要析构函数。之所以如此,那就是在C#中,内存是自动管理的,除了创建一个对象之外你什么也做不了。当垃圾收集器验证对象未在应用程序中的任何其他位置引用时,它会回收其内存,而不会为此对象声明任何析构函数,就像我们在C ++上所做的那样。

答案 2 :(得分:2)

任何语言都没有必要。他们服务于他们的目的。

析构函数将破坏对象并最终导致对象复活。(如果您尝试访问被破坏的对象,则可能会出现错误

当对象不再引用该对象时,GC将自动为您执行此操作。所以你没有必要明确这样做..

此外,实施IDisposable应优先于析构函数。