我正在尝试理解一种奇怪的情况。这段代码给出了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之后,我们决定在我现在正在处理的项目中将其关闭。

08-06 18:28