如何处理一个类而不是封装一个可处理的实例?

Pau*_*aul 5 c# idisposable resource-management

interface IMyInterace
{
void Open();
object Read();
void Close();
}

class MyImplementation : IMyInterface
{
public void Open() { /* instantiates disposible class */ }
//...
public void Close() { /* calls .Dispose(); */ }

}
Run Code Online (Sandbox Code Playgroud)

有没有一种很好的方法来处理这种情况,以确保调用类中的可处理实例?(除了文档之外,调用者没有信号他们必须调用'Close'.)IMyInterface的实现不一定封装IDisposible实例,并且在整个应用程序的生命周期内重复关闭和重新打开.

我在想这样做:

  • 在MyImplementation中实现IDisposible.
  • 设置Dispose()以调用Close().
  • 将Close()或Dispose()调用添加到Open的开头,以确保先前的调用已关闭.

IMyInterface的用户不知道他们正在使用什么实现,所以我不确定MyImplementation可处置的价值有多少,而且并非所有实现都会封装IDisposibles.

Joh*_*ers 5

处理此问题的标准方法是简单地MyImplementation 实现IDisposable.


Hen*_*man 1

除了这里已有的答案之外:

如果这个类(经常/有时)单独通过接口使用,我建议从 IDisposable 继承 IMyInterace。

这将使您的用户以一致的方式使用这些对象。当然,缺点是您可能需要向实际上不需要它的类添加(虚拟)Dispose 方法。但好处在于一致性和灵活性:如果将来某个类发生变化而需要 Dispose() 该怎么办?

一个最小的方法:

interface IMyInterace : IDisposable { }

sealed class MyImplementation : IMyInterface 
{   
   public void Open() { /* instantiates disposible class */ }

   public void Close() { /* calls _myField.Dispose(); */ }

   public void Dispose() { Close(); }  // only use this short form in a sealed class

}
Run Code Online (Sandbox Code Playgroud)