我正在开发一个.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/