我可以实现DisposeBase抽象类吗?

时间:2008-11-10 13:03:26

标签: c# .net inheritance design-patterns dispose

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

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

编辑

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

再说一遍:如果你正在处理非托管对象,你只需要一个终结器等。

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

答案 1 :(得分:2)

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

就我个人而言,我并没有发现自己经常使用IDisposable来使它成为一个问题 - 当我这样做时,我通常会密封我的课程,所以模式中的一半东西变成了无问题。

答案 2 :(得分:1)

正如Marc Gravell所说,如果你正在处理非托管对象,你只需要一个终结器。根据{{​​3}}指南第1.1.4节中的原因,在基类中引入不必要的终结器是一个坏主意:

  

与此相关的实际成本   具有终结器的实例,均来自a   性能和代码复杂性   立场。 ......最终确定会增加成本和持续时间   你的对象的生命周期   可终结的对象必须放在一个   特殊终结者注册队列   分配时,基本上是创造   一个额外的指针大小的字段来引用   对你的对象。而且,对象在   这个队列在GC期间走了   处理完毕,最终晋升为   GC使用的另一个队列   执行终结器。增加   直接可终结对象的数量   与更多的物体相关联   晋升到更高的世代,和   花费的时间增加了   GC行走队列,移动指针   周围,​​并执行终结者。   此外,通过保持对象的状态   更长时间,你倾向于使用记忆   更长的时间,这   导致工作集增加。

如果使用Dispose, Finalization, and Resource Management(以及相关类),则不太可能需要最终确定派生自DisposableBase的任何类。