У меня странная ситуация, которую я пытаюсь понять. Этот фрагмент кода дает 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 и затем вызвав Dispose в блоке finally ; на самом деле это то, как оператор using переводится компилятором .
Так что я действительно в растерянности ... разве эти два утверждения не должны быть идентичными?
Обновление
Так как люди настаивают (не читая мой комментарий) на объяснении этики using
. Я скажу так:
using (var ms = new MemoryStream(Encoding.Default.GetBytes(DefaultControlTemplateXaml)))
{
var x = XamlReader.Load(ms);
_defaultControlTemplate = x as ControlTemplate;
}
Это все еще дает CA2000 на fxcop, поэтому оригинальный вопрос остается.
Обновление 2
Добавление нескольких снимков экрана, чтобы вы могли видеть, что это Visual Studio 2010 и вся функция.
Первая версия (выдает предупреждение):
![With warning](https://i.stack.imgur.com/D3yRe.png)
Вторая версия (ок):
![Correct build](https://i.stack.imgur.com/DGOOs.png)