I一次性链条
Posted
技术标签:
【中文标题】I一次性链条【英文标题】:IDisposable chain 【发布时间】:2010-11-24 09:40:51 【问题描述】:如果我使用 IDisposable 实现一个对象,拥有该对象的所有对象是否也应该实现它,即使它们没有其他资源可以释放?
【问题讨论】:
【参考方案1】:是的。您需要处理它们,以便正确处理您的成员变量。
任何时候你封装一个 IDisposable 类,你都应该让你的类 IDisposable。在您的 Dispose 方法中,您应该释放封装的资源。基本上,像对待原生资源一样对待它们。
【讨论】:
只有你不能假设对象被释放的顺序,如果由 GC 终结器线程诱导。 是的 - 但我不确定这有什么关系。如果你包装你的类并使其成为一次性的,你可以控制每个封装资源的释放顺序。【参考方案2】:如果您想要确定性处置,最终某些客户端需要调用 Dispose 或将调用包装在“使用”块中。要渗透到您的对象,这可能需要所有者也实现 IDisposable。
您不应依赖垃圾收集器来释放任何与时间相关的资源。
【讨论】:
这并不是真正的非托管资源问题。拥有非托管资源的对象将 1) 使用SafeHandle
s 或 2) 使用用户定义的终结器来释放非托管资源。虽然这是不确定的,但垃圾收集器能够正确释放未管理的资源。正确的IDisposable
链的主要好处是及时“关闭”、“结束”或“释放”对问题敏感的资源,例如(但绝对不限于)I/O。【参考方案3】:
是的,拥有类应该实现 IDisposable 但它不需要(不应该有)终结器(析构函数)。
【讨论】:
【参考方案4】:不,他们只需要使用带有“using”语句的类来确保他们正确地处理该对象,但这些对象本身不需要实现 IDisplosable
【讨论】:
如果另一个类拥有一个一次性对象,它也应该实现 IDisposable。否则,拥有类无法让调用者处理它,因此,它在内部拥有的可支配资源。 这只是取决于类如何在内部使用对象 我用“own”这个词专门表示“有一个指定类型的成员变量”,所以这不起作用。我用“用途”这个词来表达你所说的。以上是关于I一次性链条的主要内容,如果未能解决你的问题,请参考以下文章
kafka实现无消息丢失与精确一次语义(exactly once)处理