1

使用DisposableBase 基类而不是在每个类上重新编码 Dispose 模式是否存在问题或隐藏问题?

为什么不是每个人都使用这样一个相关的类?

编辑

  1. 我自然只指实现 IDisposable 的类

  2. 我知道它用尽了继承的选择权,但我愿意付出代价(至少在我可以的时候,否则它不会伤害我)。

  3. 当我可以密封类时,我会这样做 - 但在某些情况下,我希望继承层次结构的基础是一次性的。

4

3 回答 3

2

您不需要在每个类上都实现 Dispose() - 只是那些需要确定性清理的东西。Re 一个 Disposable 基类,我不完全确定它提供了很多 -IDisposable不是一个复杂的接口。它可能有用的主要时间是如果您正在处理非托管资源并想要一个终结器,但即使那样它也没有太多代码。

就个人而言,我不会为这样的基类而烦恼。特别是,继承(在单继承世界中)很快就会受到限制。但更重要的是,重写一个方法与简单地提供一个公共 Dispose() 方法没有太大区别。

同样:如果您正在处理非托管对象,则只需要终结器等。

如果我有很多这些(非托管资源),我可能会看看是否可以让PostSharp为我完成这项工作。我不知道是否已经存在,但可能会创建一个处理(特别是)终结器等的方面。谁知道......

于 2008-11-10T13:09:37.150 回答
2

好吧,它使用了你的一个继承选项来描述你的类的一个方面——这并不理想,IMO。尝试用组合来做一些事情会很有趣,你有一个 DisposableHelper 的引用,而 IDisposable 的实现只调用了 helper.Dispose,它包含了其余的样板逻辑 - 并且可以通过 a 回调你的代码回调委托。唔。子类可以订阅受保护的 Disposing 事件以注册“我需要做某事”......这可能值得花点时间看看。

就我个人而言,我发现自己实现 IDisposable 的频率不足以使其成为问题 - 当我这样做时,我通常无论如何都会密封我的课程,因此模式中的一半内容变得不成问题。

于 2008-11-10T13:12:00.683 回答
1

正如 Marc Gravell 所说,如果您正在处理非托管对象,则只需要一个终结器。根据Dispose、Finalization 和 Resource Management指南第 1.1.4 节中的原因,在基类中引入不必要的终结器是一个坏主意:

从性能和代码复杂性的角度来看,带有终结器的实例存在实际成本。... 终结增加了对象生命周期的成本和持续时间,因为每个可终结对象在分配时都必须放在一个特殊的终结器注册队列中,本质上是创建一个额外的指针大小的字段来引用您的对象。此外,此队列中的对象在 GC 期间被遍历、处理并最终提升到 GC 用来执行终结器的另一个队列。增加可终结对象的数量与将更多对象提升到更高代直接相关,以及 GC 遍历队列、移动指针和执行终结器所花费的时间增加。此外,通过将对象的状态保持更长的时间,

如果您使用SafeHandle(和相关类),则从 DisposableBase 派生的任何类都不太可能需要最终确定。

于 2008-11-10T15:13:00.300 回答