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();
}

除了代码可读性差之外,这是解决方案。似乎最近他们更改了代码分析,并且如前所述不需要第二个内部 try/finally 块。但是,我不明白为什么。之前的修复应该足以在发生异常时处理 MemoryStream 对象。

我仍然认为 CA2202 异常是虚假的,正确的解决方案是忽略警告 - 底层对象不应该处理它不拥有的引用。此处仅供讨论和参考。

于 2015-02-05T00:00:06.540 回答