我正在开发一个 .NET 项目,该项目需要与一些用户定义的类进行交互 - 称为“作业”。所有作业类都必须实现特定接口(interface) IJob
以便库使用它们。有时,作业类可能持有非托管资源,需要显式处置。
如果我事先不知道作业是否需要明确处置,我应该如何确保所有作业在使用后得到妥善处置?我自己有一些想法,但想听听您的意见/建议:
制作
IJob : IDisposable
,强制所有作业实现Dispose()
方法。这将允许我在using
block 中处理作业,但由于大多数作业不需要需要显式处置,这可能会给客户端开发人员带来不必要的困惑。在
try-finally
block 中完成所有涉及作业的工作,并使用finally
确保在以下情况下调用Dispose()
该作业实现了IDisposable
。这使客户更容易实现新的作业类 - 不必实现空的Dispose()
方法 - 但它也隐藏了库知道并关心一次性作业的事实。
写完这篇文章后,我倾向于倾向于解决方案 #1,但我仍然认为看到替代解决方案以及我已经想到的两个解决方案的其他优缺点会很好。
最佳答案
有一个先例:Stream 基类是 IDisposable nad,因此所有 Streams 后代都是。但是 MemoryStream 不需要 Disposing。
但不要以 try/finally 为目标,using() { }
block 是更方便的速记。
所以您的选择是:您是希望所有作业都是 IDisposable 的还是只是一些作业?
第一个选项会产生很小的开销,第二个选项可以在必要时更容易忘记 Dispose(使用)。
关于c# - 我应该如何确保处理可能是一次性的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1975825/