1

以前に受け入れられた回答がVS2012以降では機能しなくなったため、これについて新しいスレッドを作成します。ネストされた using ステートメントを使用すると、次のコードの場合、Visual Studio のコード分析で迷惑な CA2202 オブジェクトを複数回破棄しないでください:

using (MemoryStream msData = new MemoryStream(encodedData))
            {
                using (BinaryWriter wtr = new BinaryWriter(msData))
                {
                    wtr.Write(IV, 0, IV.Length);
                    wtr.Write(encrypted, 0, encrypted.Length);
                }
            }

MSDN のサンプルにも記載されているため、これは面倒です。Microsoft はこの警告に対して推奨される修正も行っていますが、警告は修正されなくなりました。使用している Visual Studio のバージョン/コンパイラによっては、これが機能する場合と機能しない場合があります。

4

1 に答える 1

0

上記のコードは、コードを次のように変更することで適切に修正できます。

MemoryStream msData = null;
try
{
    msData = new MemoryStream(encodedData);
    try
    {
        using (BinaryWriter wtr = new BinaryWriter(msData))
        {
            wtr.Write(IV, 0, IV.Length);
            wtr.Write(encrypted, 0, encrypted.Length);
        }
    }
    finally
    {
        msData = null;
    }
}
finally
{
    if (msData != null)
        msData.Dispose();
}

コードの可読性が大幅に低下することを除けば、これが解決策です。最近、コード分析が変更され、前述のように 2 番目の内部 try/finally ブロックが不要になったようです。しかし、その理由はわかりません。例外が発生した場合に MemoryStream オブジェクトを破棄するには、以前の修正で十分だったはずです。

私はまだ CA2202 例外は偽物であり、適切な解決策は警告を無視することだと考えています。基になるオブジェクトは、所有していない参照を破棄してはなりません。これは、議論と参照のためにここにあるだけです。

于 2015-02-05T00:00:06.540 に答える