IDisposable接口并实现解构方法

本文关键字:方法 实现 接口 IDisposable | 更新日期: 2023-09-27 18:24:49

我正在学习C#理论,但我对其中的某些部分还不清楚。当我必须在类中调用析构函数方法时,我必须实现IDisposable接口?我的意思是实现接口和析构函数是严格相关的?

IDisposable接口并实现解构方法

C#中的"析构函数"不会"销毁"对象。相反,它指示编译器生成一个称为"终结器"的东西,它的存在向垃圾收集器表明,当发现一个对象被放弃时,应该在它或它拥有直接或间接引用的任何对象被销毁之前(通过在析构函数体内运行代码)通知它这一事实

一个物体在被抛弃时很少需要做些什么。如果一个对象请求一个或多个外部实体代表它做某事,直到另行通知(例如,它请求并被授予对文件的独占访问权限),它应该在不再需要这些实体的服务时立即通知这些实体。最好的方法是让对象用一种方法实现IDisposable.Dispose,该方法将通过执行这样的通知来整理其事务,并让这样的对象的用户在不再需要它时通知它,在放弃它之前,通过调用前面提到的IDisposable.Dispose。终结器通常只作为一个后备站存在,以防对象在没有事先通知不再需要它们的情况下被错误地放弃

从教学的角度来看,我会推迟教授任何关于析构函数的东西,因为存在一些方法可以让那些在没有首先调用IDisposable.Dispose的情况下错误地放弃对象的程序"某种程度上"工作。如果有一个写得不正确的析构函数/终结器,通常会把一个本来会以明确和明显的方式失败的程序变成一个正常工作的程序,但偶尔会以奇怪和莫名其妙的方式出现故障。仔细想想,即使编写得当的析构函数/终结器也可以产生大致相同的效果,尽管失败的频率更低,也不那么奇怪。新手花在学习如何编写终结器上的任何努力,IMHO都会更好地学习如何不需要它们。

否,如果您在C#类中实现了"终结器",则不需要同时实现IDisposable接口。然而,这样做被认为是"最佳实践"

为什么?在类中实现终结器的典型原因是回收该类实例"拥有"的稀缺资源。也许该类管理数据库连接或文件或资源句柄。由于.NET使用垃圾收集来管理对象生存期,因此无法保证终结器何时运行(有一些方法可以强制终结器运行,但这样做肯定有缺点)。

IDisposable接口为类的使用者提供了一种更仔细地控制该类管理的资源使用的方法。当您实现IDisposable接口时,您可以将终结器视为在类未正确"释放"的情况下的故障安全机制。