首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何满足CA2202 (不要多次释放对象)

如何满足CA2202 (不要多次释放对象)
EN

Stack Overflow用户
提问于 2015-02-11 02:54:34
回答 2查看 510关注 0票数 3

这个问题在你看来可能是CA2202,如何解决这个案子的重复,它有一个被接受的答案。但你可能会意识到,被接受的答案基于质量不佳而有5票被否决。另外,任何其他投票的答案实际上并不能解决这个问题。他们中的大多数解释了如何压制这条规则,或者争论这条规则有多错误,以及为什么我们应该忽视它。既然有这个规则,就应该有一个方法来满足它,我正在寻求社区的支持来解决这个问题。

我试图在下面的代码中找到满足CA2202的方法。我理解这里的问题是,使用encryptedStream语句的也处理了对象。但是,如果我最终删除了部件,它将开始抛出CA2000

那么,按照CA2202和CA2000编写它的正确方式是什么呢?

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-11 14:33:52

这是对您的问题的字面回答,因为它不会发出CA警告而不对它们进行压制,并且只会调用每个Dispose一次:

代码语言:javascript
复制
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并抑制虚假警告的代码要困难(实际上,我不完全确定上面的代码是正确的!)它首先挫败了进行静态代码分析的全部意义:编写可靠的代码。您应该将代码分析看作是一种工具,而不是正确性的仲裁者。

票数 6
EN

Stack Overflow用户

发布于 2015-02-11 13:46:33

真的,真的,压制住警告。警告是错误的。这没什么大不了的。:-)

做谷歌搜索"CA2202嵌套使用“,你会发现数十个堆叠溢出和MSDN论坛上的帖子。https://www.google.com/search?q=ca2202+nested+using

最终,CA2202和CA2000是有限的,因为它们无法理解嵌套IDisposable对象的行为。有些流可以配置为保持底层流处于打开状态,但通常不会。抑制确实是正确的解决方案。问题是,你在努力成为一个好公民,所以你在努力遵守给你的警告。但是静态分析不足以解决这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28445790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档