哪里不使用IDisposable实现?

时间:2014-02-13 05:51:47

标签: idisposable

我的问题是具体的,为什么以及在哪里不实现IDisposable接口。

如果我不使用&消耗任何非托管资源,仍然是实现IDisposable接口的好习惯。

如果我这样做有什么优点或缺点?或者实施它是一种好习惯吗?

请指教。

2 个答案:

答案 0 :(得分:1)

您出于以下两个原因之一实施IDisposable

  1. 如果您有免费的非托管资源。
    这样做是因为这是GC知道如何释放非托管资源的唯一方法,否则它不知道。 这是关于要释放的资源。这种情况实际上非常罕见 - 通常通过现有的托管对象访问非托管资源。这个案子需要一个完整的#34;官方推荐"实现。通常,您应该将非托管资源包装在它们自己的单独(托管)类中,该类执行IDisposable implimentation(而不是在其他更大的对象中包含非托管资源)。

  2. 如果您的课程中包含的内容符合IDisposable。
    你这样做不是因为如果你没有(他们愿意)这些对象不会获得免费,而是因为你希望能够控制何时释放这些资源。有一个处置impliementation是部署一类的一次性成员意味着消费者可以应用using语句即可轻松控制在资源释放。在初步实践往往不是这是最主要的原因实现IDisposable。请注意,如果你的课程是密封的,你可以在这里使用一个简单的IDisposable实现 - 即只是处理 - 没有必要完整的#34;官方推荐' implimenation。

  3. 如果这些情况都不适用则无需实施。

答案 1 :(得分:0)

如果一个类实现IDisposable,那么通常会赋予任何创建该类实例的代码,以确保在该实例被放弃之前调用Dispose;它可以通过在不再需要时调用对象本身上的Dispose,或者通过确保接收引用的其他对象接受“所有权”并对其负责来履行此职责。在大多数情况下,当代码编写正确时,尚未调用IDisposable的每个Dispose对象将在每个时间点都有一个其他实体(对象或执行范围) “拥有”它。在IDisposable对象的生命周期内,所有权可能会在不同的实体之间传递,但是当一个对象获得所有权时,前一个对象应该放弃它。

在许多情况下,对象将以跟踪所有权并不困难的方式使用。通常,任何状态将被修改的对象应该只有一个所有者,并且该所有者将知道何时不再需要该对象。另外,因为修改拥有对象的状态将构成对所有者状态的修改,所以所有者本身应该具有单个所有者。在这种情况下,要求所有者致电Dispose不会造成任何困难(所有者的所有者应致电Dispose)。然而,有一个“陷阱”有这个原则:一个对象可能创建一个可变类的实例,但从不改变它,也不允许其他人这样做。如果有问题的可变类只保存值并且没有实现IDisposable,那么持有对永远不会实际变异的事物的引用的对象不需要关注所有权。这可以允许一些主要简化,因为许多对象可以保存对不变对象的引用,而不必担心它们中的哪一个将最后使用它。但是,如果有问题的可变类实现IDisposable,则不再可能进行这种简化。