我如何确保处理可能的一次性物品?我正在开发一个.NET项目,该项目需要与一些用户定义的类(称为“作业”)进行交互。所有作业类都必须实现特定接口IJob以便库使用它们。有时,作业类可能包含需要显式处理的非托管资源。如果我事先不知道作业是否需要明确处置,我应该如何确保所有作业在使用后都得到妥善处置?我有自己的一些想法,但想听听您的意见/建议:使IJob:IDisposable,强制所有作业实现Dispose()方法。这将允许我的using块中的作业,但由于大多数作业不需要显式处理,这可能会给客户端开发人员造成不必要的混淆。在try-finally块中完成涉及作业的所有工作,最后使用Dispose()确保作业实现IDisposable。这使客户端更容易实现新的作业类——无需实现空的Dispose()方法——但它也隐藏了库了解并关心一次性作业的事实。写完这篇文章后,我倾向于倾向于解决方案#1,但我仍然认为看到替代解决方案会更好,并且我已经考虑了两者的其他优缺点。有一个先例:Stream基类是IDisposablenad,因此所有Streams后代都是。但是MemoryStream不需要Disposing。但是using(){}块不是以try/finally为目标,而是一种更方便的速记。所以你的选择是:你想要所有的工作都是IDisposable的还是只是一些?第一个选项会产生很少的开销,第二个选项将使必要时更容易忘记Dispose(using)。#2是foreach结构的工作原理。这也是Autofac容器处理的工作方式。语义差异在于您是说一项工作本身是一次性的,还是说一个实现可能是一次性的。从你的例子中可以清楚地看出前者不是真的,工作本身不是一次性的。所以我建议#2,但使用扩展方法来集中try/finally:publicstaticvoidExecute(thisIJobjob){try{job.Run();}最后{vardisposableJob=jobasIDisposable;如果(disposableJob!=null){disposableJob。处置();}}}我想是这样。我宁愿开发人员实现一个空的Dispose方法,也不愿忘记实现必要的Dispose方法。我会选择#2,并注意任何一次性用品都会被扔掉。基本上,如果您拥有该对象的所有权,则您有义务处置实现IDisposable的对象。如果您阅读EffectiveC#/MoreEffectiveC#,BillWagner给出了相同的建议(我显然同意;-)如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
