有没有办法标记一个方法,以便代码分析或构建带有错误消息来处置方法返回的对象。例如在以下方法中。
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代码分析警告但是没有为此特定示例调用。
答案 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()
的下一个调用者。