所有类都应该实现IDisposable接口吗?

时间:2010-07-19 21:48:25

标签: vb.net idisposable

(非常新手问题)

我可能误解了这一点,但在MSDN上我相信它说在你编写的每个类中实现Dispose析构函数是一种好习惯。我应该(你)真的为我写的每个类实现IDisposable接口吗?

另外,在“类”声明之后实现一个接口将“Implements”关键字放在行上的正确语法是什么?我把它放在与“class”相同的行上,我收到了一个错误。

还有一个?:在编写接口实现的方法时,必须遵循这种语法,例如:

Public Sub Dispose() Implements IDisposable.Dispose

我在上面的代码中很好奇,如果我需要将实现的方法声明为     “实现System.IDisposable.Dispose”

4 个答案:

答案 0 :(得分:10)

如果您的类包含实现IDisposable的其他类的实例,或者它包含本机资源,那么您应该只实现IDisposable

有关详细信息,请参阅this article

答案 1 :(得分:3)

不,你不应该。如果您直接使用非托管资源或者具有实现IDisposable的成员并且想要确保在您的类上调用dispose方法时调用它们的dispose方法,则只实现IDisposable。

答案 2 :(得分:2)

计算机可能执行的许多操作都需要进行反平衡的“清理”操作。例如,打开文件的行为需要关闭它。使用调制解调器发出呼叫的行为需要断开它。在不执行所需的平衡清理的情况下执行操作有时可能是无害的,但有时可能会在计算机或现实世界中产生严重后果(在用户弹出介质之前未能关闭文件可能会导致文件损坏和数据丢失;未能终止调制解调器连接可能会花费额外的电话费多少钱。

IDisposable的目的是提供一种方法,通过这种方法,良好的程序可以确保实际完成所需的任何清理操作。执行必须通过清理进行平衡的操作的任何例程都应保留执行此类清理所需的信息和动力,直到执行完为止;如果例程在返回调用者之前无法执行此类清理,则应该(1)向调用者提供信息,并记录为要求调用者使用该信息执行清理,或者(2)保留一个或多个字段中的必要信息,并实现IDisposable;当调用IDisposable.Dispose时,对象应该使用保存的信息来执行清理。

请注意,如果请求创建IDisposable对象的任何对象接受并承担确保将在某个时间调用对象的IDisposable.Dispose方法的责任,则IDisposable只能干净地工作。系统确实提供了一种称为终结的“备份”方法,对象可以使用它来确保他们有机会执行清理。从本质上讲,一个对象向系统注册一个请求“请告诉我,如果我被遗弃”。如果系统检测到某个对象已被放弃,它将尝试为该对象提供执行任何必要清理的机会。请注意,系统可能需要一段时间才能注意到对象已被放弃,并且由于各种原因,通知可能并非总是发生。在弃用之前调用IDisposable.Dispose几乎总是好得多,而不是依赖于“最后机会”终结机制。

答案 3 :(得分:0)

.Net框架有一个垃圾收集器,并且大部分为您管理内存的分配和释放(在创建新对象时)。但是,您还需要管理未受管理的资源(我也看到被称为本机资源)。所以现在垃圾收集器还不够好,你必须使用IDisposable接口来管理内存。一个很好的例子是创建DataAccesslayer,您可以在其中处理数据库连接并使用IDisposable接口

检查一下,看看如何实现iDisposable接口: https://msdn.microsoft.com/en-us/library/498928w2%28v=vs.110%29.aspx