IDisposable接口和实现解构方法

时间:2012-02-15 19:12:39

标签: c# idisposable

我正在学习C#理论,我没有明确的理论部分。当我必须在类中调用析构函数方法时我必须实现IDisposable接口吗?我的意思是实现接口与析构函数严格相关?

2 个答案:

答案 0 :(得分:1)

不,如果在C#类中实现'终结器',则不需要同时实现IDisposable接口。然而,这被认为是“最佳实践”。

为什么呢?那么,在类中实现终结器的典型原因是回收类所包含的稀缺资源“拥有”。也许该类管理数据库连接或文件或资源句柄。由于.NET使用垃圾收集来管理对象的生命周期,因此不能保证何时运行终结器(有很多方法可以强制终结器运行,但这样做有明显的缺点)。

IDisposable接口为类的使用者提供了一种方法,可以更仔细地控制由类管理的资源的使用。当您实现IDisposable接口时,如果类未正确“处理”,您可以将终结器视为故障安全机制。

答案 1 :(得分:1)

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

很少有人需要某个物体做出某些回应被抛弃的事情。如果一个对象已经请求一个或多个外部实体代表它做某事直到另行通知(例如它已经请求并被授予对文件的独占访问权),则它应该在不再需要它们的服务时立即通知这些实体。最好的方法是让对象实现IDisposable.Dispose一个方法,通过执行这样的通知将其事务按顺序排列,并让这个对象的用户在不再需要时通知它,在放弃之前,通过调用前面提到的IDisposable.Dispose。终结者通常只作为一个后退,如果对象被错误地放弃而没有首先被告知他们不再需要它们。

从教学的角度来看,我会推迟教导任何关于析构函数的事情,而不仅仅是存在这样一种事实,即在没有事先调用IDisposable.Dispose的情况下错误地放弃对象的程序可以被制作成“有点”的工作。拥有一个不正确编写的析构函数/终结函数通常会将一个以明显和明显的方式失败的程序变成一个通常有效的程序,但偶尔会以奇怪和莫名的方式出现故障。想想看,即使是正确编写的析构函数/终结函数也可以产生相同的效果,尽管失败的频率较低且不那么奇怪。新手学习如何编写终结器所花费的任何努力都可以更好地学习如何不需要它们。