Страшное предупреждение CA2202 в Visual Studio Code Analysis

Я собираюсь создать новую тему для этого, так как предыдущие принятые ответы больше не работают с 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 / компилятор вы используете.

1 ответ

Приведенный выше код может быть исправлен надлежащим образом с помощью следующего изменения кода:

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 является поддельным, и правильное решение состоит в том, чтобы игнорировать предупреждение - лежащие в основе объекты не должны избавляться от ссылок, которыми он не владеет. Это просто здесь для обсуждения и ссылки.

Другие вопросы по тегам