1

以下を有する:

StringWriter sw = null;
try
{
    sw = new StringWriter();
    using (var xw = new XmlTextWriter(sw))
    {
        doc.WriteTo(xw);
        return sw.ToString();
    }
}
finally 
{
    sw?.Dispose();
}

Visual Studio 2015 でCA2202 (オブジェクトを複数回破棄しないでください) 警告をトリガーします。

fianllyただし、ブロックを次のように変更すると、警告はトリガーされません。

finally 
{
    if (sw != null)
    {
        sw.Dispose();
    }
}

finallyブロックか何かの null 条件演算子の奇妙な点ですか、それとも Visual Studio の分析ツールが単にそれを理解していないのでしょうか?

編集: おそらく関連: Dispose() で null 条件演算子を使用すると、コード分析によってフラグが立てられるのはなぜですか?

4

2 に答える 2

0

using ブロックで xw を宣言したため、using ブロックを終了すると、XmlTextWriter の IDisposable メソッドが呼び出されます。文字列ライターは XMLWriter でのみ使用されるため、ガベージ コレクターによっても破棄されます (オブジェクトがまだ使用されているかどうかを判断するために GC が参照カウントに頼らなくても済むようにするための最適化です)。

編集: 詳細については、このMSDN の記事を参照してください。

于 2016-01-07T14:31:24.050 に答える