如何解决无法为 StreamWriter 应用 `using` 的新语法
在 MSDN about using
上,出现了新语法。我喜欢它并开始应用它。
代替
using (MemoryStream memory = new MemoryStream())
{
using (CryptoStream crypto = new CryptoStream(memory,transform,CryptoStreamMode.Write))
{
using (StreamWriter writer = new StreamWriter(crypto))
{
writer.Write(text);
}
}
}
我可以走了
using Aes aes = Aes.Create();
using ICryptoTransform transform = aes.CreateEncryptor(key,iv);
using MemoryStream memory = new MemoryStream();
using CryptoStream crypto = new CryptoStream(memory,CryptoStreamMode.Write);
using (StreamWriter writer = new StreamWriter(crypto))
writer.Write(text);
但是,我不能让最后一部分以新的方式工作。出于某种原因,StreamWriter
不允许我这样做。
using Aes aes = Aes.Create();
using ICryptoTransform transform = aes.CreateEncryptor(key,CryptoStreamMode.Write);
using StreamWriter writer = new StreamWriter(crypto);
writer.Write(text);
我真的不明白为什么。在链接的文章中可能有技术解释,因为他们讨论了要求和限制。遗憾的是,我只是看不出他们在哪里说的以及暗示了什么。
应 Skeety 的要求 - 完全可重复的样品。
public void Test()
{
string text = "hakuna matata";
string code = "1234567890abcdef";
byte[] key = Encoding.ASCII.GetBytes(code);
byte[] iv = key[..16];
using Aes aes = Aes.Create();
using ICryptoTransform transform = aes.CreateEncryptor(key,iv);
using MemoryStream memory = new MemoryStream();
using CryptoStream crypto = new CryptoStream(memory,CryptoStreamMode.Write);
using StreamWriter writer = new StreamWriter(crypto);
writer.Write(text);
//writer.Flush();
//using (StreamWriter writer = new StreamWriter(crypto))
// writer.Write(text);
string output = Convert.ToBase64String(memory.ToArray());
}
解决方法
在您的旧代码下,您的所有资源,包括 StreamWriter
和 CryptoStream
,都在其 using
块的末尾隐式处置。处理后,任何挂起的内容都会刷新到 MemoryStream
。因此,当您检查这些 MemoryStream
块末尾的 using
after 时,它会被正确填充。
在您的新代码中,新的 using
语法意味着资源仅在 封闭 块(在本例中为父方法)的末尾处理。因此,当您在同一方法中检查 MemoryStream
时,您正在这样做 before StreamWriter
和 CryptoStream
已被处理,因此 before 其内容已刷新到 MemoryStream
。
为了演示起见,在读取 Dispose
之前调用 StreamWriter
上的 MemoryStream
将恢复正确的行为:
using StreamWriter writer = new StreamWriter(crypto);
writer.Write(text);
writer.Dispose()
string output = Convert.ToBase64String(memory.ToArray());
也就是说,我建议不要使用上述方法,因为您将显式 Dispose
调用与 using
生成的隐式调用混合在一起。
或者,您可以使用 外部 方法中的 MemoryStream
,从而确保内部方法在执行结束时释放其资源:
public void Test()
{
var memory = TestInner();
string output = Convert.ToBase64String(memory.ToArray());
}
private MemoryStream TestInner()
{
string text = "hakuna matata";
string code = "1234567890abcdef";
byte[] key = Encoding.ASCII.GetBytes(code);
byte[] iv = key[..16];
using Aes aes = Aes.Create();
using ICryptoTransform transform = aes.CreateEncryptor(key,iv);
using MemoryStream memory = new MemoryStream();
using CryptoStream crypto = new CryptoStream(memory,transform,CryptoStreamMode.Write);
using StreamWriter writer = new StreamWriter(crypto);
writer.Write(text);
return memory;
}
但是,在这种情况下,为了清晰起见,我更喜欢使用旧的 using
块。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。