【问题标题】:IDisposable - automated check for using constructIDisposable - 使用构造的自动检查
【发布时间】:2011-06-02 11:27:06
【问题描述】:

有没有人知道一种自动查找任何变量的方法,其中类型实现了 IDisposable 但未使用 using 构造?

即。一种检查可能未释放的非托管资源的方法?

另外,是否可以查看正在运行的应用程序持有的资源的数量和类型?

【问题讨论】:

  • Visual Studio Premium 或 Ultimate 的代码分析功能会捕捉到这一点。
  • 如果我有 VS Premium 或 Ultimate!哦,好吧,我用 cygwin + grep 做到了(因为我知道可能违规的类型)!

标签: c# .net using-statement


【解决方案1】:

有一个代码分析规则:

http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx

这可以从 VS 2010 Premium 或 Ultimate 运行,也可以与 FxCop 单独运行:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=917023f6-d5b7-41bb-bbc0-411a7d66cf3c

我看到的另一件事是在构造 IDisposable 对象时捕获堆栈跟踪,然后如果命中 finalize(意味着未调用 Dispose()),则使用构造的堆栈跟踪记录错误。这很昂贵,因此您可能只想在开发中执行此操作,或者仅在您的应用程序第二次遇到此问题时才开始收集堆栈跟踪(如果您遇到一次,您很可能会在其中多次遇到它单个应用程序执行)。此方法适用于寿命较长的IDisposable 实例(不仅仅是局部变量)。当然,它也只适用于自定义 IDisposable 对象,因为它需要在构造函数/dispose/finalizer 中使用自定义代码。

【讨论】:

    【解决方案2】:

    VS 2010 代码分析器和 FxCop? (不确定)可靠性规则将很好地检测分析代码中是否存在执行路径,其中实现IDisposable 的对象超出范围而不调用Dispsoe()(它过于急切,并且在许多情况下会检测到错误积极的)。

    这当然不会强制执行 using 构造,因为正确实现的 try-finally 块将通过测试(两者在引擎盖下显然是等效的,所以我不确定这是否是一个问题)。

    编辑:FX Cop 不支持此警告。它从 VS 2005 代码分析器开始可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2016-05-09
      相关资源
      最近更新 更多