2014-11-21 39 views
1

有没有什么办法标记一个方法,以便代码分析或建立与提供错误消息来处置方法返回的对象。例如,在下面的方法。任何方式来知道如果调用方法应该处置被调用的方法返回的对象

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代码分析警告,但没有被调用这个特定的例子。

+1

你真的不想立刻处置它,是吗? – leppie 2014-11-21 07:20:50

+1

在这种情况下,代码分析无法判断是否需要处理该对象。该方法返回该对象,这通常意味着它不应该被丢弃,因为您将它交给其他代码。所以在你的例子中,你不应该使用'using'。一般来说,代码分析在识别未处理的对象以及不离开该方法方面做得很好。 你有一个更合理的例子,代码分析没有发现真正的错误吗? – 2014-11-21 07:22:18

+0

这是一个真正的例子,如果您在其他方法中使用此方法GetBlackBrush(),代码分析不会给出任何错误。代码分析不会给出错误。 – 2014-11-21 07:29:41

回答

0

CA2000警告是你可能会后,看到documentation

如果一次性对象未明确设置所有 引用之前,它是超出范围,对象将在一些 不确定的配置垃圾收集器运行终结器的时间为 的对象。由于可能发生的异常事件会阻止对象运行的终结器 ,因此该对象应该是 而不是。

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

+0

你对CA2213正确,但只是尝试这个例子,我没有得到运行代码分析后的CA2213。 – 2014-11-21 07:56:31

+0

我刚刚检查过它,并在一个案例中(在同一班)它显示警告,并在其他(IDisposable创建外部类)它不是。我正在使用VS2013 – b2zw2a 2014-11-21 08:00:37

0

没有特定的约定用于指示哪些方法转移对象的所有权,并且框架本身在这方面相当不一致。如果方法创建并返回对新的参考文件而不保留该参考的副本,则该画笔的收件人应该处理该参考。相反,如果该方法做了一些这样的:

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()