c# - 确定 IDisposable 是否应该扩展接口(interface)或在实现所述接口(interface)的类上实现

标签 c# dispose idisposable

我如何确定是应该使用 IDisposable 扩展我的接口(interface)之一还是在实现我的接口(interface)的类上实现 IDisposable?

我有一个不需要处理任何外部资源的接口(interface),除了一个特定的实现。我的选择似乎是:

1) 在要求所有实现都实现 Dispose 的接口(interface)上实现 IDisposable,即使只是一个空方法。

-或-

2) 仅在具有需要处理的资源的类上实现 IDisposable。这将导致“使用”问题,因为我的对象是从工厂创建的,因此所有上游代码都针对接口(interface)工作。由于该接口(interface)未绑定(bind) IDisposable,因此“使用”看不到 Dispose 方法。但是,我可以将工厂结果转换为实现;然而,这会让消费者意识到实现,从而违背了接口(interface)的目的。

关于最佳实践有什么想法吗?

最佳答案

如果您希望调用者只能与接口(interface)交互,而不能与实现交互,那么您希望接口(interface)扩展 IDisposable。如果不是,他们将需要检查 value 是否为 IDisposable 以查看是否需要处理它。

如果负责处理该对象的对象知 Prop 体实现,并且只有被赋予对它的引用(但不负责处理它)的对象使用该接口(interface),然后考虑第二个选项。

第一个选项的一个很好的例子是 IEnumerator。许多 IEnumerator 对象在被处置时不需要做任何事情,但有些需要做,因此接口(interface)扩展了 IDisposable 因为负责创建/生命周期的对象该对象将(或应该)永远不知道底层实现。

第二个例子是IComparer 许多需要比较的对象是一次性的,但是通过接口(interface)使用对象的代码部分不是它不负责它的创建/生命周期,因此它不需要知道该类型是否是一次性的。

关于c# - 确定 IDisposable 是否应该扩展接口(interface)或在实现所述接口(interface)的类上实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25998191/

相关文章:

在较旧的 .net 版本上运行的 C#

java - 如何处理 Draw2D 标签上设置的 SWT 字体?

c# - 我应该有返回 Disposable 实例列表的方法吗?

asp.net - 这是使用 Dispose 方法的正确方法吗?

c# - MVC 6 更改返回内容类型

c# - C#中的继承问题

c# - 尝试插入 schema.table.ID 时出现 ORA-01400

c# - 如何处置 MemoryStream 对象

VB.NET - 实现 IDisposable 时是否应该添加 Finalize 方法?

c# - 是否有为 using 语句实现 IDisposable 的公共(public)对象列表?