【问题标题】:Identify IDisposable objects识别 IDisposable 对象
【发布时间】:2010-10-10 02:41:48
【问题描述】:

我必须查看其他人编写的代码,该代码存在一些内存泄漏。现在我正在搜索一次性对象以使用 using 语句将它们包含在内,我想知道是否有一种快速方法可以告诉您声明的所有一次性对象。我的意思是像 resharper 或其他 Visual Studio 插件。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我知道你的意思。我不知道,但看看 FxCop。它可能在某处有一条规则来检查实现 IDisposable 的对象是否未释放。请注意,只是一种预感。

    更新Mitch Wheat 写道:

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

    谢谢,米奇。

    【讨论】:

    • 我打算推荐 FxCop,但找不到合适的规则。但是,根据代码的数量,您可能可以编写自己的规则。
    • FxCop 包含规则,也就是说所有从实现 IDisposable 的类型派生的类型都应该实现 Dispose() 模式
    • 谢谢,米奇。我已经更新了答案以引起 OP 的注意。
    【解决方案2】:

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

    也许您解析的接口不是从 IDisposable 继承的,但实际使用的服务类会继承吗?如何处理?等等

    【讨论】:

      【解决方案3】:

      您可以使用ReSharper 执行此操作。借助 ReSharper,您可以使用 Alt-End 轻松导航任何接口的实现,但对于像 IDisposable 这样的流行接口,这并不实用。

      你可以这样做:

      1. 转到对象浏览器(Ctrl-Alt-J 或查看->对象浏览器)
      2. 查找System.IDisposable
      3. 右键单击并选择“Find Usages Advanced”(ReSharper 的菜单项)
      4. 用户查找,勾选“Implementations”,在Scope下选择Solution
      5. 您将获得实现IDisposable所有 类型(您的解决方案)的列表。 粗体中的那些是你想要的——它们直接实现IDisposable

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-13
          • 2011-07-16
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多