CA2202:对象可以被处置多次

时间:2018-11-27 20:28:19

标签: c# cng

我在以下代码段中收到以下警告,但我不明白为什么

  

警告CA2202:Microsoft。用法:对象'memStream'可以在方法'Encrypt(string)'中多次处置。为避免生成System.ObjectDisposedException,不应在一个对象上多次调用Dispose。

代码:

string Encrypt(string toEncrypt)
{
    byte[] key = ...
    byte[] iv = ...

    using (AesCng aes = new AesCng())
    using (ICryptoTransform encryptor = aes.CreateEncryptor(key, iv))
    using (MemoryStream memStream = new MemoryStream())
    using (CryptoStream cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write))
    {
        UTF7Encoding encoder = new UTF7Encoding();
        byte[] bytes = encoder.GetBytes(toEncrypt);

        cryptoStream.Write(bytes, 0, bytes.Length);
        cryptoStream.FlushFinalBlock();

        return Convert.ToBase64String(memStream.ToArray());
    }
}

据我所知,CryptoStream对象在处置传入的Stream本身时不会对其进行处置。那么变量memStream怎么可能被多次处置呢?

非常感谢。

2 个答案:

答案 0 :(得分:2)

CryptoStream.Dispose()默认情况下将处置基础流。如果您不希望这种行为,则需要使用构造函数overload,该构造函数明确使CryptoStream处理后基础流保持打开状态。

您可以看到here的实现方式。

答案 1 :(得分:-1)

您可以将重载的CryptoStream构造函数与LeaveOpen参数一起使用。

不需要,因为CryptoStream对象正在使用块

-A POSTROUTING ! -d 10.0.0.0/8 -m comment --comment "kubenet: SNAT for outbound traffic from cluster" -m addrtype ! --dst-type LOCAL -j MASQUERADE

代码:

cryptoStream.FlushFinalBlock();
  

leaveOpen:true表示在处理CryptoStream对象时不关闭基础流

CryptoStream ctor