私は理解しようとしている奇妙な状況に陥っています。CA2000は「使用する」方法を使用していますが、try/finallyを使用していません
var ms = new MemoryStream(Encoding.Default.GetBytes(DefaultControlTemplateXaml));
using(ms)
{
var x = XamlReader.Load(ms);
_defaultControlTemplate = x as ControlTemplate;
}
しかし、この他の作品ではありません:Microsoft's documentation 1として
var ms = new MemoryStream(Encoding.Default.GetBytes(DefaultControlTemplateXaml));
try
{
var x = XamlReader.Load(ms);
_defaultControlTemplate = x as ControlTemplate;
}
finally { ms.Dispose(); }
:
のコードのこの作品は、CA2000 (...すべての参照前にオブジェクト上のDisposeを呼び出す)に与えていますusingステートメントを使用すると、オブジェクトのメソッドを呼び出すときに例外が発生した場合でもDisposeが確実に呼び出されます。 tryブロック内にオブジェクトを配置し、finallyブロックでDisposeを呼び出すことで同じ結果を得ることができます;実際には、これはusingステートメントがコンパイラによってどのように翻訳されるかです。
私は本当にここで失われています...同じものと思われる2つのステートメントはありませんか?
更新
人々が主張するのでusing
ettiqueteを説明する上で(私のコメントを読まず)。私はこのようにそれを置くでしょう:
using (var ms = new MemoryStream(Encoding.Default.GetBytes(DefaultControlTemplateXaml)))
{
var x = XamlReader.Load(ms);
_defaultControlTemplate = x as ControlTemplate;
}
このはまだ FxCopの上CA2000を与えるので、オリジナルの疑問は残ります。あなたはこれは、Visual Studio 2010と全体の機能で見ることができるようにいくつかのスクリーンショットを追加
アップデート2
。
最初のバージョン(警告を与える):
セカンドバージョン(OK):
もちろん、IDisposableを 'using'括弧内にインスタンス化することをお勧めします。 – Jcl
@ xanatos:これは私の考えでもありましたが、C#言語の仕様をチェックして、オブジェクトが 'try'ブロックの外に作成されたことを示しています。 –
コード分析(別名FxCOP 11)のVS2010に問題があるとフラグが立てられていない、このシナリオに関して古いFxCOPバージョンにバグがありますか? –