我有一个担忧。我是计算机科学的一年级学生。通常我在课堂上很好奇但是,并不总是我的老师有答案,或者不总是知道答案。 C#中是否需要析构函数?我的意思是,如果我必须像通常使用构造函数那样实现析构函数方法,这是一个好习惯还是我可以避免它,垃圾收集器会为我做这个?
答案 0 :(得分:13)
析构函数(或终结函数)在语言中很好用 - 但你几乎永远不会使用它们。基本上,如果你在非托管资源上有一个直接句柄,你应该只需要它们,这不仅非常罕见,而且使用SafeHandle
作为一个微小的间接层是一个更好的想法无论如何(为您处理清理工作)。有关详细信息,请参阅Joe Duffy's blog post on the topic。
对于它的价值,我不记得上次我写一个终结器,而不是测试一些奇怪的行为或其他。
在绝大多数时间里,生活更简单:
using
语句确保在完成后将其释放IDisposable
的任何其他内容)作为实例变量,则您的类型本身应实现IDisposable
。 (我尽可能避免这种情况。即使 是必要的,你也可以通过上课sealed
来简化生活,此时你至少不需要担心其他具有更多非托管状态的子类需要清理。)答案 1 :(得分:3)
C#中不需要析构函数。之所以如此,那就是在C#中,内存是自动管理的,除了创建一个对象之外你什么也做不了。当垃圾收集器验证对象未在应用程序中的任何其他位置引用时,它会回收其内存,而不会为此对象声明任何析构函数,就像我们在C ++上所做的那样。
答案 2 :(得分:2)
任何语言都没有必要。他们服务于他们的目的。
析构函数将破坏对象并最终导致对象复活。(如果您尝试访问被破坏的对象,则可能会出现错误)
当对象不再引用该对象时,GC将自动为您执行此操作。所以你没有必要明确这样做..
此外,实施IDisposable
应优先于析构函数。