我要为此创建一个新线程,因为之前接受的答案不再适用于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版本/编译器。
答案 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异常是假的,正确的解决方案是忽略警告 - 底层对象不应该处理它不拥有的引用。这仅供讨论和参考。