这个问题在你看来可能是CA2202,如何解决这个案子的重复,它有一个被接受的答案。但你可能会意识到,被接受的答案基于质量不佳而有5票被否决。另外,任何其他投票的答案实际上并不能解决这个问题。他们中的大多数解释了如何压制这条规则,或者争论这条规则有多错误,以及为什么我们应该忽视它。既然有这个规则,就应该有一个方法来满足它,我正在寻求社区的支持来解决这个问题。
我试图在下面的代码中找到满足CA2202的方法。我理解这里的问题是,使用encryptedStream语句的也处理了对象。但是,如果我最终删除了部件,它将开始抛出CA2000
那么,按照CA2202和CA2000编写它的正确方式是什么呢?
byte[] result;
MemoryStream encryptedStream = null;
try
{
encryptedStream = new MemoryStream();
using (var cryptStream = new CryptoStream(encryptedStream, cryptoTransform, CryptoStreamMode.Write))
{
cryptStream.Write(inputInBytes, 0, inputInBytes.Length);
cryptStream.FlushFinalBlock();
result = encryptedStream.ToArray();
}
}
finally
{
encryptedStream?.Dispose();
}
string output = Convert.ToBase64String(result);发布于 2015-02-11 14:33:52
这是对您的问题的字面回答,因为它不会发出CA警告而不对它们进行压制,并且只会调用每个Dispose一次:
MemoryStream encryptedStream = null;
CryptoStream cryptStream = null;
try {
encryptedStream = new MemoryStream();
cryptStream = new CryptoStream(encryptedStream, cryptoTransform, CryptoStreamMode.Write);
cryptStream.Write(inputInBytes, 0, inputInBytes.Length);
cryptStream.FlushFinalBlock();
result = encryptedStream.ToArray();
} finally {
if (cryptStream != null) {
cryptStream.Dispose();
} else {
if (encryptedStream != null) encryptedStream.Dispose();
}
}
string output = Convert.ToBase64String(result);但是任何有价值的开发人员都应该看看这个,然后说:“嗯,就好像他们不知道using,我最好重写一下”。不要在生产代码中这样做。压制警告。要获得这样正确的代码(面对更改时保持正确)实际上比编写使用using并抑制虚假警告的代码要困难(实际上,我不完全确定上面的代码是正确的!)它首先挫败了进行静态代码分析的全部意义:编写可靠的代码。您应该将代码分析看作是一种工具,而不是正确性的仲裁者。
发布于 2015-02-11 13:46:33
真的,真的,压制住警告。警告是错误的。这没什么大不了的。:-)
做谷歌搜索"CA2202嵌套使用“,你会发现数十个堆叠溢出和MSDN论坛上的帖子。https://www.google.com/search?q=ca2202+nested+using
最终,CA2202和CA2000是有限的,因为它们无法理解嵌套IDisposable对象的行为。有些流可以配置为保持底层流处于打开状态,但通常不会。抑制确实是正确的解决方案。问题是,你在努力成为一个好公民,所以你在努力遵守给你的警告。但是静态分析不足以解决这个问题。
https://stackoverflow.com/questions/28445790
复制相似问题