c# - IDisposable 是 Liskof 所指的行为吗?

标签 c# .net idisposable solid-principles liskov-substitution-principle

是否应该在基类上实现 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/

相关文章:

c# - 数据集更新与 SQL 查询

c# - .Net WMI 类 - 我必须处理哪些类?

c# - 您是否应该实现 IDisposable.Dispose() 以使其永远不会抛出?

c# - 使用 Silverlight 适当实现 IDisposable?

c# - 长度= 'serverStream.Length'引发了 'System.NotSupportedException'类型的异常

c# - 您推荐我使用哪种文件类型来播放非常小的视频?

c# - C# 中的 BufferManager 和 System.Buffers.ArrayPool 有什么区别

c# - 返回一个用ajax写入的HtmlTable

.net - ADO.NET Entity Framework 的实际好处是什么?

c# - 向自定义异常添加额外信息