4

实现 IDisposable 接口的目的是什么?我已经看到一些实现它的类,但我不明白为什么。

4

5 回答 5

9

如果您的类创建了非托管资源,那么您可以实现 IDisposable 以便在处理对象时正确清理这些资源。您覆盖 Dispose 并在那里释放它们。

于 2009-01-18T02:27:20.640 回答
5

当你的类使用一些系统资源时,确保资源也被释放是类的责任。通过 .Net 设计,您应该在类的 Dispose 方法中执行此操作。IDisposable 接口标记您的类在不再使用时需要释放资源,并且 Dispose 方法可用,以便您的类的用户可以调用它来释放消耗的资源。

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

于 2009-01-18T02:31:49.600 回答
3

除了释放非托管资源外,对象在超出范围时还可以有效地执行某些操作。一个有用的示例可能是计时器对象:此类对象可以打印出自在 Dispose() 方法中构造它们以来经过的时间。然后可以使用这些对象记录一组操作所花费的大致时间:

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

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

于 2009-01-18T04:16:01.450 回答
2

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

于 2009-01-18T02:36:15.690 回答
1

许多对象以如果不清理将导致问题的方式操纵其他实体。这些其他实体可能几乎是任何东西,它们可能几乎在任何地方。例如,一个 Socket 对象可能要求另一台机器打开一个 TCP 连接。另一台机器可能无法同时处理很多连接;事实上,它可能是一个网络设备,一次只能处理一个连接。如果一个程序要打开一个套接字然后忘记它,除非或直到套接字关闭(也许设备可能会在几分钟不活动后自行关闭套接字,但它在那之前是没用的)。

如果一个对象实现了 IDisposable,这意味着它具有执行必要的清理操作所需的知识和动力,并且需要在这些知识和动力丢失之前执行这些操作。调用 IDisposable.Dispose 将确保执行所有此类清理操作,从而可以安全地放弃对象。

Microsoft 允许对象通过注册一个名为 Finalize 的方法来请求保护以防止被遗弃。如果一个对象这样做了,如果系统检测到该对象已被放弃,则将调用 Finalize 方法。在 Finalize 方法有机会运行之前,不会从内存中删除该对象,也不会从内存中删除该对象及其直接或间接引用的任何对象。这提供了某种“后盾”,以防对象在没有首先被处置的情况下被放弃。然而,对于实现 Finalize 的对象有很多陷阱,因为无法保证何时调用它。不仅一个对象可能在 Finalize 被调用之前很长时间就被放弃了,而且如果一个人不小心,系统可能实际上在一个对象上调用 Finalize,而它的一部分仍在使用中。危险的东西。它'

于 2011-04-16T19:52:29.893 回答