为什么WaitHandle显式实现IDisposable?

时间:2010-01-08 13:27:23

标签: .net idisposable

System.Threading.WaitHandle(以及ManualResetEvent等)显式实现IDisposable。这似乎阻止了它的使用(调用Close()实现与转换为IDisposable和调用Dispose相同)。

我只是想知道这是否有充分理由?

3 个答案:

答案 0 :(得分:2)

Dispose()引发的.NET API存在尴尬。同时具有Close和Dispose方法的类的其他示例是Stream派生类,Socket,TcpClient,EventLog,Process,SqlConnection和许多其他类。

我不知道这样一个类的例子,它不只是在Close()方法实现中调用Dispose()。换句话说,使用“using”语句并且不调用Close就可以了。然而,API设计者倾向于将Close()作为结束对象使用的更直接的方式。这是可辩护的,Dispose()方法往往是从基类继承的,通常是一个非常模糊的基类。

答案 1 :(得分:0)

因为调用Close是关闭这些系统资源的首选方法。

答案 2 :(得分:0)

某些类允许在同一对象上多次使用Open和Close;一些这样的类,但不是全部,都包含逻辑,因此调用Dispose不仅会调用Close,还会禁止进一步调用Open。​​

某些类的作者可能不想添加逻辑来强制执行“无法重新打开后处置”规则,但希望将来可以选择这样做。由于想要关闭并重新打开对象的程序员不太可能强制转换为IDisposable来执行关闭,因此很可能任何在对象上调用IDisposable.Dispose的人都不会介意它是否变得无法使用。因此,即使IDisposable.Dispose使对象无效以防止重用,几乎所有非故意写入的客户端代码都将继续工作。相比之下,如果一个对象在其公共接口中同时具有Dispose和Close方法,那么程序员可能会认为它们是可互换的,并且即使在他们希望重用对象的情况下也使用Dispose。

相关问题