我正在尝试理解一种奇怪的情况。这段代码给出了CA2000(在所有引用之前调用Dispose on object ...):
var ms = new MemoryStream(Encoding.Default.GetBytes(DefaultControlTemplateXaml));
using(ms)
{
var x = XamlReader.Load(ms);
_defaultControlTemplate = x as ControlTemplate;
}
但是,另一部分不是:
var ms = new MemoryStream(Encoding.Default.GetBytes(DefaultControlTemplateXaml));
try
{
var x = XamlReader.Load(ms);
_defaultControlTemplate = x as ControlTemplate;
}
finally { ms.Dispose(); }
根据Microsoft's documentation:
using语句确保即使在调用对象的方法时发生异常,也将调用Dispose。通过将对象放在try块中,然后在finally块中调用Dispose,可以实现相同的结果。实际上,这就是编译器翻译using语句的方式。
所以我真的很茫然……这两个语句不应该是相同的吗?
更新资料
由于人们坚持(不阅读我的评论)来解释
using
彩饰。我这样说: using (var ms = new MemoryStream(Encoding.Default.GetBytes(DefaultControlTemplateXaml)))
{
var x = XamlReader.Load(ms);
_defaultControlTemplate = x as ControlTemplate;
}
这仍然在fxcop上提供了CA2000,因此原始问题仍然存在。
更新2
添加一些屏幕截图,以便您可以看到这是Visual Studio 2010和整个功能。
第一版(发出警告):
第二版(确定):
最佳答案
(删除了一些不适用于该问题的内容以及一些关于ThreadAbortException
的错误内容。)
您可能遇到了CA2000报告的误报。您可以搜索Microsoft Connect for CA2000。存在相当多的问题(并非全部都是误报错误)。
由于这些误报,我个人在某些项目中关闭了CA2000。我将Visual Studio 2010与Code Analysis结合使用,并且我刚刚确认,是的,在不得不多次抑制CA2000之后,我们决定在我现在正在处理的项目中将其关闭。