C# CA2202不要多次处理对象-哪个对象是首选的处理对象?

C# CA2202不要多次处理对象-哪个对象是首选的处理对象?,c#,C#,我在下面的代码中得到了CA2202警告 using (MemoryStream msDecrypt = new MemoryStream(encrypted)) using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) using (StreamReader srDecrypt = new StreamReader(csDecrypt))

我在下面的代码中得到了CA2202警告

using (MemoryStream msDecrypt = new MemoryStream(encrypted))
        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
        return srDecrypt.ReadToEnd();
此代码在msDecrypt和csDecrypt上都触发,它们都有自己的using语句。 是否有要处理的首选对象? 外部(msDecrypt)或内部(CSDERypt)-如果是,原因是什么

这个问题不是这个问题的重复,因为我想知道一般来说,哪一个更好处理内部/后期对象还是外部/早期对象以及原因?

如果向下滚动到示例部分,就会解释这一点。简而言之,这是由于内部
using
块中的资源也包含外部
using
块的资源造成的。当您对内部资源调用
Dispose
时,它也会处理其中包含的外部资源

建议的修复方法是将整个内容包装在一个
try
块中,使用
块将内部资源放入
中,然后调用
Dispose
,如果
块中的外部资源尚未
null
,则调用
Dispose


为了更直接地回答您的问题,内部资源应该是最好处理的资源。

dispose异常不会隐藏。然而,礼貌的对象不会两次处理自己。(至少,我会写一次性代码。)嗯,你说得对。不过,假设我只处理一个。。。哪一个。为什么?把两者都处理掉。抑制警告或忽略它。这就是我当前正在做的(如上面的代码所示)。但是我想问的是,如果我们只处理一个,有没有理由选择一个而不是另一个?基本上,调用
dispose()
是安全的,在
IDisposable
的文档中提到,它不会产生任何不良影响。如果您担心声称实现了
IDisposable
,但主动破坏了该接口的显式保证的类,那么为什么不担心即使第一个
Dispose()
失败的类呢?因为它提供了“官方的”指导-处理内部,并验证是否仍需要处理外部。然而,这是一个笨拙的方式做事情,我不相信它不是没有自己的潜在问题,并希望有更深入的信息。