是否应该在基类上实现 IDisposable,尽管那里不需要,只是为了满足可选 IDisposable 子类的 Liskov 要求?
最佳答案
IDisposable
界面有点奇怪。大多数接口(interface)对实现它们的类施加语义要求,但是IDisposable
才不是。任何不需要 IDisposable
的类(class)可以通过定义 Dispose
来合法地实现它不执行任何操作的方法。因此,有IDisposable
成为一个界面有点违背正常使用。
然而,由此产生的问题通常仅限于一种特定场景:返回可能需要清理的类型的新实例的函数(例如 IEnumerable<T>.GetEnumerator()
返回 IEnumerator<T>
,它实现 IDisposable
)。返回需要清理的内容的工厂不能替代返回可以简单丢弃的内容的工厂。避免可替代性问题的方法是定义一个基础工厂来返回一个“可能”需要清理的类型,但会实现 IDisposable.Dispose
不管它实际上是否如此。调用Dispose
的来电者在不再需要的实例上将与使用 Dispose
的实例一起正常工作执行所需的清理以及 Dispose
的清理方法什么都不做。
关于c# - IDisposable 是 Liskof 所指的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30063536/