实现IDisposable接口的目的是什么?我见过一些类实现它,但我不明白为什么。

有帮助吗?

解决方案

如果您的类创建非托管资源,那么你可以实现IDisposable,使这些资源将被清理,当正确的对象处理。你重写处置及排放在那里。

其他提示

当你的类是利用一些系统资源,它是类的责任,以确保资源被释放了。通过净设计你应该做的是,在类的Dispose方法。您的类需要释放资源时,它不再使用,并且提供了Dispose方法,以便类的用户可以调用它来释放资源消耗。IDisposable接口标记

如果你想自动清理才能正常工作,并希望使用using()语句IDisposable的方法也是必不可少的。

除了释放非托管资源,对象可以有效地执行一些操作中,它们走出去的范围的时刻。一个有用的例子可以是一个计时器对象:这样的物体可以打印出来,因为它们在Dispose()方法施工经过的时间。然后,这些对象可以被用来记录所采取的一些操作集的近似时间:

using(Timer tmr=new Timer("blah"))
{
    // do whatever
}

这可以手动完成,当然,但我的感觉是一个人应该充分利用地方的编译器自动生成正确的代码的能力可能。

这一切都与垃圾收集机制有关。Chris Sells 描述了垃圾收集、终结器以及 Dispose 模式(和 IDisposable 接口)的原因 《.NET Rocks!》第 10 集 (大约 34 分钟开始)。

许多对象操纵方式与其他实体会造成问题,如果没有清理。这些其他实体可以是几乎任何东西,他们可以在几乎任何地方。作为一个例子,一个Socket对象可能会要求另一台机器上打开一个TCP连接。其它机器可能不能够处理一次非常多的连接;事实上,它可能是一个配备网络设备,它只能同时处理一个连接。如果程序是打开一个套接字,并简单地忘掉它,没有其他的计算机将能够连接到该设备,除非或直到插座得到封闭(也许是设备可能会闲置几分钟后关闭插座本身,而是它将是无用的,直到然后)。

如果一个对象实现IDisposable,这意味着它具有执行必要的清理操作所需要的知识和动力,并且这种动作需要这样的知识和动力丧失之前被执行。主叫IDisposable.Dispose将确保所有此类清理操作得到执行,于是该对象可以被安全地抛弃了。

微软允许对象通过注册称为Finalize方法请求放弃保护。如果对象确实如此,如果系统检测到物体已被抛弃的定案方法将被调用。无论其所持有的直接或间接引用的对象,也没有任何对象,将从内存中,直到定案方法已被赋予了机会运行被删除。这提供了情况下的对象而没有被第一处理完毕抛弃的“止回”的东西。有很多陷阱,但是,与实现最终确定的对象,因为谁也不能保证何时会被调用。不仅可能的对象被放弃最后确定之前很长一段时间被调用,但如果一个不小心,系统可实际调用敲定对象上,而它的一部分仍然在使用。危险的东西。这是再好不过的正确使用丢弃。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top