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