c# - 我应该如何确保处理可能是一次性的元素?

标签 c# .net interface idisposable

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

如果我事先不知道作业是否需要明确处置,我应该如何确保所有作业在使用后得到妥善处置?我自己有一些想法,但想听听您的意见/建议:

  1. 制作 IJob : IDisposable,强制所有作业实现 Dispose() 方法。这将允许我在 using block 中处理作业,但由于大多数作业不需要需要显式处置,这可能会给客户端开发人员带来不必要的困惑。

  2. 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/

相关文章:

c# - 在另一台计算机上远程连接到mysql时出现问题

c# - .NET 运行时如何移动内存?

.net - 是否有用于以编程方式更改项目和解决方案文件(.vbproj、.csproj、.sln)的 API?

javascript - TS2331 'this' 无法在模块或命名空间主体中引用

iphone - 如何使用界面生成器构建长界面

c# - WPF 应用程序中使用了哪些线程?

javascript - 使用 Image URI 将图像文件存储在服务器文件系统中

c# - 投影 : filling 2 arrays at once

c# - 在这种情况下,垃圾收集器是否回收了该对象?

java - 包含具有相同签名的方法的多个接口(interface)