任何方法都知道调用方法是否应该处理被调用方法返回的对象

时间:2014-11-21 07:19:45

标签: c# dispose static-code-analysis

有没有办法标记一个方法,以便代码分析或构建带有错误消息来处置方法返回的对象。例如在以下方法中。

  private void chart1_Click(object sender, EventArgs e)
    {
        Brush sb = GetBlackBrush();
    }

    Brush GetBlackBrush()
    {
        SolidBrush sb = new SolidBrush(Color.Black);
        return sb;
    }

每当有任何方法调用GetBlackBrush时,在VS2010中构建解决方案时,我应该得到代码分析警告或构建错误或构建警告以指示我需要处理Brush对象。我希望我应该在chart1_Click()方法中获得一些指示来处理画笔对象。

这只是一个示例代码,我知道我们应该使用"使用" ,但这里有解决方案。

有一个CA2213代码分析警告但是没有为此特定示例调用。

2 个答案:

答案 0 :(得分:0)

您可能会遇到CA2000警告,请参阅documentation

  

如果一次性物品没有明确处理   对它的引用超出了范围,该对象将被置于某些位置   垃圾收集器运行终结器时的不确定时间   物体。因为可能会发生可能阻止的异常事件   从运行的对象的终结器,对象应该是   明确地代替了。

不确定是否可以将其标记为错误,但应该将其取出。 您可能还想启用CA2213

答案 1 :(得分:0)

没有特定的约定来指示哪些方法转移IDisposable对象的所有权,而框架本身在这方面相当不一致。如果方法创建并返回对新SolidBrush的引用而不保留该引用的副本,则该画笔的接收者应该将其处置掉。相反,该方法已经完成了类似的事情:

WeakReference<Brush> myBrush = new WeakReference<Brush>(); // Field of class hosting method

Brush GetBlackBrush()
{
  Brush ret = myBrush.Target;
  if (ret == null)
  {
    ret = new SolidBrush(Color.Black);
    myBrush.Target = ret;
  }
}

然后正确性将指示收件人在其收到的对象上调用Dispose [使用弱引用将确保在任何时候上述代码都会只泄漏一个额外的SolidBrush对象;如果调用者在没有处理它的情况下放弃实例,那么通常GC不会注意到实例被放弃了(在这种情况下,下一个调用者将收到相同的实例),或者它已经清除了它。在任何一种情况下,一次只能存在被抛弃的一个画笔实例。此外,在Dispose持有对它的引用时调用画笔实例上的myBrush会破坏GetBlackBrush()的下一个调用者。