识别IDisposable对象

时间:2009-02-26 15:24:15

标签: c# memory-leaks dispose idisposable using-statement

我必须检查一些其他人有一些内存泄漏的代码。现在我正在搜索一次性对象以使用using语句对它们进行包围,我想知道是否有一种快速方式告诉你所有声明的一次性对象。我的意思是像resharper或另一个visual studio插件。< / p>

感谢。

4 个答案:

答案 0 :(得分:11)

我知道你的意思。我不知道,但看看FxCop。它可能在某处有一个规则,用于检查是否未处理实现IDisposable的对象。只是预感,记住。

更新Mitch Wheat写道:

  

FxCop包含规则,那就是说从实现IDisposable的类型派生的所有类型都应该实现Dispose()模式

谢谢,米奇。

答案 1 :(得分:10)

您可以使用ReSharper执行此操作。使用ReSharper,您可以使用Alt-End轻松导航任何界面的实现,但对于IDisposable这样的流行界面,这是不切实际的。

以下是您可以做的事情:

  1. 转到对象浏览器(Ctrl-Alt-J或View-&gt;对象浏览器)
  2. 查找System.IDisposable
  3. 右键单击并选择“查找高级用法”(ReSharper的菜单项)
  4. 用户查找,选中“范围选择解决方案”
  5. 下的“实施”
  6. 您将获得实施IDisposable所有类型(您的解决方案)的列表。 粗体中的那些是您想要的 - 他们直接实现IDisposable
  7. 希望有所帮助。

答案 2 :(得分:5)

FxCop中的使用规则CA2213(DisposableFieldsShouldBeDisposed)和CA2215(DisposeMethodsShouldCallBaseClassDispose)将捕获在您自己的类中未正确调用dispose的位置,但我不相信有任何东西可以检查dispose总是被调用虽然具有讽刺意味DoNotDisposeObjectsMultipleTimes

的规则(CA2202)

答案 3 :(得分:0)

此外,根据您是否使用这样的系统,如果您使用的是IoC容器,在通过接口将服务返回给您之前,它可能会经历多层代码,并且处理它可能并不容易。在这种情况下可以使用。

您解决的接口可能不是从IDisposable继承的,但是正在使用的实际服务类是什么?怎么处理?等