用于搜索尚未处置的IDisposable对象的完整解决方案的工具

时间:2011-04-02 01:00:27

标签: c# dispose

正如我们大多数人所知,为了在.net中很好地管理内存,最好总是在实现IDisposable的对象上调用Dispose()。但是,当每天编写大量代码时,很容易忘记这样做。

是否有人知道搜索c#解决方案的工具并查找未处置一次性对象的所有位置?我可以看到,当对象喜欢将位图分配给属性但是更基本的检查器有价值时,这种情况不起作用。

感谢您的时间。

4 个答案:

答案 0 :(得分:11)

我发现Visual Studio 2010可以完全满足我的需求。要获得该行为,请执行以下操作:

  • 按照How to: Create a Custom Rule Set
  • 中的说明创建新的代码分析规则集
  • 将以下规则添加到规则集中:

    • 在丢失范围之前处置对象
    • 不要多次丢弃对象
    • 应处理一次性字段
    • Dispose方法应该调用基类dispose

或者只是将它们作为通用代码分析规则的一部分运行。它不会捕获所有东西,但它比没有安全网更好的安全网。

答案 1 :(得分:0)

我最喜欢的内存分析器是Ants Profiler from Redgate。它使用起来非常简单,并且有很多教程可以帮助您入门。最好的是14天的免费试用,所以你可以尝试一下,确保它在你购买之前适合你。

答案 2 :(得分:0)

假设您在手动调用Dispose时使用推荐的抑制终结模式,您可以通过添加一些代码来告诉您在终结器线程上调用Dispose时发现这些错误。

~MyClass()
{  
     Dispose( false );
     Console.WriteLine( "Argh, release me! I want better co-workers!" );
}

public Dispose()
{  
     Dispose( true );
     GC.SuppressFinalization( this );
}

public Dispose( bool invokedByDeveloper )
{  
     if( invokedByDeveloper )
         // free managed resources

     // free unmanaged resources
}

使用BrandonZeider建议的内存分析器也是一种选择。 ANTS是一个伟大的,虽然有点昂贵的探测器。 Jetbrains也是一个很好的探测器,你可以试用30天而不买。

答案 3 :(得分:0)

可能最好的办法就是“痴迷”处理这样的问题。考虑通过执行诸如规划代码的时间和位置以及处理对象等方式来提高效率。如果您在团队中工作,请向他们处理。

如果您的一次性物品的范围是短暂的并且可能包含在某个方法的一小部分中,请使用它来包裹它,以确保它被丢弃。我使用(语法正确吗?)我得到的任何机会。

显然,这些不是自动化的建议,并不总是有效,但不是很难有正确的思维方式,并且学习可以应用于日常工作的最佳实践。那是我的两分钱。