我遇到了一个奇怪的情况,想要理解。这段代码产生了CA2000 (在所有引用之前调用对象的Dispose方法) :
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的文档:
使用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并且包含整个函数。
第一个版本(有警告):
第二个版本(没有问题):
using
括号内实例化IDisposable是最佳实践,但我将其放在前面,以使语句尽可能相同。 - Jcltry
块之外创建的。 - Martin Liversage