我正在开发一个.NET项目,该项目需要与一些用户定义的类进行交互-简称为“工作”。所有作业类都必须实现特定的接口(interface)IJob才能使库使用它们。有时,作业类可能包含非托管资源,需要显式处理它。

如果我事先不知道工作是否需要明确处理,我该如何确保所有工作在使用后得到适当处理?我本人有一些想法,但想听听您的意见/建议:

  • 生成IJob : IDisposable,强制所有作业实现Dispose()方法。这将使我能够处理using块中的作业,但是由于预计大多数作业不需要显式处理,因此这可能会给客户端开发人员带来不必要的困惑。
  • 完成所有涉及try-finally块中作业的工作,并使用finally确保如果作业实现Dispose(),则调用IDisposable。这样,客户不必实现空的Dispose()方法即可更轻松地实现新的作业类,但同时也隐藏了图书馆知道并关心一次性作业的事实。

  • 在写完这篇文章之后,我倾向于倾向于解决方案1,但是我仍然认为很高兴看到替代解决方案,以及我已经想到的这两种方案的其他优点/缺点。

    最佳答案

    有一个先例:Stream基类是IDisposable nad,因此所有Streams后代都是。但是MemoryStream不需要处理。
    但是不要以尝试/最终为目标,using() { }块是一个更方便的速记。

    因此,您的选择是:您是否希望所有Jobs都是IDisposposable的?

    第一个选项会产生少量开销,第二个选项使在必要时更容易忘记Dispose(使用)。

    关于c# - 我应如何确保处置可能的一次性物品?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1975825/

    10-13 05:57