有没有办法让一个实现IDisposable的类在没有通过using块实例化的情况下抛出异常?

Phi*_*ley 15 c# idisposable

我发现了一些潜在危险的类,如果它们无法实例化,那么它们就会更加危险,除非它们在using语句中完成.

我想知道是否有办法强制类只以这种方式实例化.

(我知道IL汇编了什么,这就是为什么我不能确定这甚至可能)

干杯,

菲尔.

Cod*_*ked 13

没有办法强制执行它,但您可以构建自定义代码分析规则来标记它.

  • FxCop和Nitriq也可用于此类规则实施. (3认同)
  • 话虽这么说 - 有时你明确地不想立即处理一个对象.有时您需要存储它,在这种情况下,这可能会产生误报. (2认同)

Ree*_*sey 8

不,没有办法让编译器强制执行此操作.无论如何,这样做是危险的,因为有时候你想要以IDisposable其他方式使用类,比如将它们封装在第二IDisposable类的实例中,等等.

如果您的类正确实现,那么析构函数应该清理所有未管理的,未处理的资源.这不太理想,但仍然可以工作.

一个好的选择是让析构函数在调试期间引发异常或记录.这可以帮助您在测试和调试期间跟踪任何"错过"使用IDisposable不当的情况.

  • 调试期间的通知为+1.我发现在构造中记录堆栈跟踪有助于追踪创建违规对象的位置,以及应该处置它的位置. (2认同)

Yur*_*ich 5

出于所有有效目的,这是不可能的.特别是因为它不必是一个using,有人可能已经写出了try{}finally{}.您可以确保在终结器中正确处理任何未管理的内容.

  • @Phil然后我认为你需要更好的开发人员,因为有时使用`try {} catch {} finally {}`比使用{try {} catch {}}`或`try {using {}} catch更方便{}`无论如何你都会遇到一个陷阱.如果除了在finally块中处理之外还需要做一些事情,也更方便. (5认同)