Visual Studio代码分析中可怕的CA2202警告

时间:2015-02-05 00:00:07

标签: c# visual-studio-2010 visual-studio visual-studio-2012 ca2202

我要为此创建一个新线程,因为之前接受的答案不再适用于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 samples中。微软甚至有recommended fix的警告,但它不再修复警告。这可能适用于您,也可能不适用,具体取决于您使用的Visual Studio版本/编译器。

1 个答案:

答案 0 :(得分: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();
}

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

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