是C#中必需的析构函数
本文关键字:析构函数 | 更新日期: 2023-09-27 17:57:56
我有一个问题。我是计算机科学一年级的学生。通常我在课堂上很好奇,但我的老师并不总是有答案,或者并不总是知道答案。C#中是否需要析构函数?我的意思是,如果我必须像通常使用构造函数那样实现析构函数方法,这是一个好的做法,还是我可以避免它,垃圾收集器会为我做这件事?
在语言中使用析构函数(或终结器)是很好的,但您几乎应该永远不要使用它们。基本上,只有当您在非托管资源上有直接句柄时,您才应该需要它们,而且这种情况非常罕见,而且使用SafeHandle
作为一个小级别的间接是一个更好的主意(它可以为您处理清理)。有关更多详细信息,请参阅Joe Duffy的博客文章。
值得一提的是,我不记得我上一次写终结器是什么时候了,只是为了测试一些奇怪的行为。
在绝大多数情况下,生活更简单:
- 垃圾收集器可以处理内存资源清理
- 如果在方法中本地使用非托管资源(例如文件),请使用
using
语句确保在使用完后释放它 - 如果需要引用非托管资源(或实现
IDisposable
的任何其他资源)作为类型中的实例变量,则类型本身应实现IDisposable
。(我尽量避免这种情况。即使是所必需的,您也可以通过使类sealed
变得更简单,在这一点上,您至少不需要担心其他子类有更多的非托管状态需要清理。)
C#中不需要析构函数。之所以是这样,是因为在C#中,内存是自动管理的,除了创建对象之外,你什么都不用做。当垃圾收集器验证某个对象在应用程序中没有被引用时,它会回收内存,而无需为该对象声明任何析构函数,就像我们在C++上所做的那样。
在任何语言中都没有什么是不必要的。他们为自己的目的服务。
破坏者会破坏对象,你最终会复活对象。(如果你试图访问被破坏的对象,你可能会得到一个错误)
当对象不再有任何引用时,GC会自动为您执行此操作。因此,您没有必要显式执行此操作。。
此外,实现IDisposable
应该优先于析构函数。