【发布时间】:2020-03-04 10:08:29
【问题描述】:
Microsoft 文档在此页面上有以下代码:
最内部的“使用”语句假设 Dispose csEncrypt,而后者又假设 Dispose msEncrypt 流。但是,在最内部的 using 语句范围之后,msEncrypt 仍然存在并被使用(调用了它的 ToArray())。
Microsoft 文档明确指出:“调用 StreamWriter.Dispose 时,StreamWriter 对象在提供的 Stream 对象上调用 Dispose()。”。后者意味着 csEncrypt 也被释放/关闭,这反过来又关闭了 msEncrypt (https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/cryptostream.cs,23052627697efb77, Can a CryptoStream leave the base Stream open?)。
那么请解释一下我们如何仍然可以调用“msEncrypt.ToArray();”在最里面的 using 语句的范围结束之后?
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
【问题讨论】:
-
最内部的
using不会释放csEncrypt变量,而是释放swEncrypt变量,它持有StreamWriter对象。变量csEncrypt可以免费使用(在相应的using块内)以及msEncrypt。 -
那为什么编译器会给出警告 CA2202 说 csEncrypt 和 msEncrypt 可以被多次释放?
-
请edit 您的问题包括您拥有的完整源代码(如果可能,作为minimal reproducible example)和完整的错误消息以及有关您从编译器获得的警告的所有可用信息。
-
顺便说一句:你可能想看看stackoverflow.com/questions/3831676/…
标签: c# memorystream using-statement cryptostream