我在以下代码段中收到以下警告,但我不明白为什么
警告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
怎么可能被多次处置呢?
非常感谢。
答案 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对象时不关闭基础流