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

C# 知道调用方法是否应该处理被调用方法返回的对象的任何方法,c#,dispose,static-code-analysis,C#,Dispose,Static Code Analysis,是否有任何方法标记方法,以便代码分析或生成时给出错误消息来处理方法返回的对象。例如,在以下方法中 private void chart1_Click(object sender, EventArgs e) { Brush sb = GetBlackBrush(); } Brush GetBlackBrush() { SolidBrush sb = new SolidBrush(Color.Black); ret

是否有任何方法标记方法,以便代码分析或生成时给出错误消息来处理方法返回的对象。例如,在以下方法中

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

    Brush GetBlackBrush()
    {
        SolidBrush sb = new SolidBrush(Color.Black);
        return sb;
    }
在VS2010中构建解决方案时,每当有任何方法调用GetBlackBrush时,我都会收到代码分析警告或生成错误或生成警告,以指示我需要处理笔刷对象。我想我应该在chart1_Click()方法中得到一些指示来处理笔刷对象

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


有一个CA2213代码分析警告,但在这个特定示例中没有调用该警告。

CA2000警告可能是您需要的,请参阅:

如果一次性对象未在所有 对它的引用超出范围,将在某个时间处理该对象 垃圾收集器运行的终结器的不确定时间 物体。因为可能会发生异常事件,从而阻止 如果对象的终结器无法运行,则该对象应为 而是显式地处理

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

没有特定的约定来指示哪些方法转移了
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;
  }
}
WeakReference myBrush=new WeakReference();//类宿主方法的字段
画笔
{
Brush ret=myBrush.Target;
if(ret==null)
{
ret=新的SolidBrush(颜色为黑色);
myBrush.Target=ret;
}
}

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

您真的不想立即处理它,是吗?在这种情况下,代码分析无法判断您是否需要处理该对象。该方法返回该对象,这通常意味着不应处理该对象,因为您正在将其交给其他代码。因此,在您的示例中,您不应在gen中使用
using
总之,代码分析很好地识别了未处理和未离开方法的对象。您是否有一个更合理的示例,说明代码分析没有发现真正的错误?这是一个真正的示例,如果您使用此方法GetBlackBrush(),代码分析不会给出任何错误在任何其他方法中。代码分析都不会给出错误。请准确发布您编写的使用GetBlackBrush且不会在代码分析中引起警告的代码。为什么您希望CA2213=“应处理一次性字段”对于此示例?它不包括任何可重用字段,仅包括可丢弃的本地引用。不过,我希望在chart1_Click方法上看到CA2000=“失去作用域前处置对象”。您对CA2213的看法是正确的,但请尝试此示例,在运行代码分析后,我没有得到CA2213。我刚刚检查了它,在一个示例中(在同一个类中)它显示警告,而在另一个类中(在类外创建的IDisposable)它不是。我使用的是VS2013