【问题标题】:How to find all Classes implementing IDisposable?如何找到所有实现 IDisposable 的类?
【发布时间】:2010-06-07 09:25:11
【问题描述】:

我正在处理一个大型项目,我的任务之一是消除可能的内存泄漏。在我的代码中,我注意到几个 IDisposable 项目没有被处置,并已修复。然而,这引出了一个更基本的问题,如何在我的项目中找到所有实现 IDisposable 的类使用? (不是自定义创建的类,而是已使用的标准库类)。
我已经找到了一个不太明显的实现 IDisposable 的类(DataTable 实现 MarshalByValueComponent,它继承了 IDisposable)。现在,我正在使用 MSDN 手动检查任何可疑类,但是否有某种方法可以使这个过程自动化?

【问题讨论】:

    标签: c# visual-studio-2008 idisposable


    【解决方案1】:

    Reflector 可以告诉你哪些类实现了IDisposable:只需在Reflector 中找到IDisposable 接口,然后展开“派生类型”节点

    另一个选项,来自代码,是扫描所有加载的程序集以查找实现 IDisposable 的类型:

    var disposableTypes =
        from a in AppDomain.CurrentDomain.GetAssemblies()
        from t in a.GetTypes()
        where typeof(IDisposable).IsAssignableFrom(t)
        select t;
    

    【讨论】:

    • 上面的这段代码,扫描所有加载的程序集(而不仅仅是正在执行的程序集)并给出所有按命名空间排序的一次性类型,因此很容易检查您拥有的任何一次性类型错过了。非常感谢:)
    【解决方案2】:

    使用 FxCop 测试您的项目。它可以捕获所有未释放 IDisposable 对象的地方。您可能需要做一些工作来禁用所有不相关的 FxCop 规则,只留下与 IDisposable 相关的规则。

    例如,这是 FxCop IDisposable 规则之一:http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx

    注意:您需要找到未正确处理的您自己的、.NET 和第三方 IDisposable 对象。

    【讨论】:

      【解决方案3】:

      您可以使用NDepend 分析您的项目并找到所有实现 IDisposable 的类型。

      这是结果的 cql 查询

      SELECT TYPES WHERE Implement "System.IDisposable"
      

      【讨论】:

        【解决方案4】:

        我认为下面的代码可能会起作用。如果从外部工具运行,则必须对其进行调整以加载正确的程序集。

        Assembly asm = Assembly.GetExecutingAssembly();
        foreach (Type type in asm.GetTypes())
        {
         if(type.GetInterface(typeof(IDisposable).FullName)  != null)
         {
          // Store the list somewhere
         }
        }
        

        【讨论】:

        • 这不是我想要的。此代码循环遍历当前程序集中的类型 defined,而我想在当前程序集中 used 的类型上运行它。
          我可以轻松检查我的项目中定义的类之一是否实现了 IDisposable,但是我想检查我正在使用的标准库类是否实现了 IDisposable。
        • @apoorv020:我认为应该能够在.Net框架程序集(您的项目引用的任何程序)上运行上述代码,然后您可以保存所有内容的列表实现IDisposable,然后在您的源代码中搜索该列表中的任何内容?
        • “Thomas Levesque”的代码正是这样做的。不过感谢您的回答,它为我指明了正确的方向。
        【解决方案5】:

        试试这个 LINQ 查询:

        var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes()
                              where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass
                              select t;
        

        【讨论】:

        • 不认为这行得通,来自 MSDN 的评论:IsSubclassOf 方法不能用于确定一个接口是否派生自另一个接口,或者一个类是否实现了一个接口
        猜你喜欢
        • 1970-01-01
        • 2011-01-30
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多