代码之家  ›  专栏  ›  技术社区  ›  David Espart

标识IDisposable对象

  •  12
  • David Espart  · 技术社区  · 16 年前

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

    谢谢。

    4 回复  |  直到 16 年前
        1
  •  11
  •   Community CDub    8 年前

    我知道你的意思。我不知道,但看看fxcop。它可能在某个地方有一个规则,用于检查实现IDisposable的对象是否未被释放。只是一种预感。

    更新 : Mitch Wheat 写作:

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

    谢谢,Mitch。

        2
  •  10
  •   Igal Tabachnik    16 年前

    你可以这样做 ReSharper . 使用Resharper,您可以使用alt end轻松地导航任何接口的实现,但对于流行的接口,如 IDisposable 这是不实际的。

    你可以这样做:

    1. 转到对象浏览器(ctrl-alt-j或view->对象浏览器)
    2. 发现 System.IDisposable
    3. 右键单击并选择“查找高级用法”(Resharper的菜单项)
    4. 用户查找,检查“实现”,在范围选择解决方案下
    5. 你会得到一份 全部的 实现的(解决方案的)类型 不可分的 . 那些在 大胆的 是你想要的-它们实现 不可分的 直接。

    希望有帮助。

        3
  •  5
  •   Wolfwyrd    16 年前

    fxcop中的使用规则ca2213(DisposableFieldsShouldEdisposed)和ca2215(DisposeMethodsShouldCallBaseClassDispose)将捕获在您自己的类中未正确调用Dispose的位置,但我不认为有任何内容需要检查是否始终调用Dispose,尽管具有讽刺意味的是,有一个规则(ca2202)用于DoNotDisposeObjectsMultimes

        4
  •  0
  •   Lasse V. Karlsen    16 年前

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

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