【发布时间】:2018-11-18 17:52:11
【问题描述】:
我发现自己在重复这段代码
using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)
{
using (var aes = AesCryptoServiceProvider() { Key = ... }
{
// Read the IV at the beginning of the filestream
using (var cryptoStream = new CryptoStream(fileStream, aes.CreateDecryptor(), CryptoStreamMode.Read)
{
// Actual code only using cryptoStream
}
}
}
和
using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write)
{
using (var aes = AesCryptoServiceProvider() { Key = ... }
{
// Write the IV at the beginning of the filestream
using (var cryptoStream = new CryptoStream(fileStream, aes.CreateDecryptor(), CryptoStreamMode.Write)
{
// Actual code only using cryptoStream
}
}
}
我问自己,是否可以用类似的东西代替它
using (var cryptoStream = new MyDecryptionStream(path))
{
// Actual code
}
实际代码可能非常不同。它可以是必须保存的图像或 xml 序列化。
我尝试实现自己的 Stream 类,它将所有方法转换为私有属性 CryptoStream。但这没有成功。它总是在对应的地方坏掉,我一开始就试图阅读 IV。
【问题讨论】:
-
请注意,您并不总是需要所有
{}。在没有中间{的情况下做using () /* new line*/ using () /* new line */ using () {被认为是美学上正确的。 Visual Studio 将在同一级别格式化所有using -
是的,可以通过在 MyDecryptionStream 上实现 IDisposable。如果没有代码和不同的问题,很难说出你没有成功的原因。
-
那么你的实现是什么,具体来说,它是如何不起作用的?如果您没有展示它并且没有描述它有什么问题,我们无法告诉您如何解决它。
-
别忘了
using只是IDisposables的语法糖。这是使用产生的,以消除任何魔法:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…。因此,答案是,是的,您可以通过创建一个IDisposableMyDecryptionStream来正确管理底层FileStream、AesCryptoServiceProvider和CryptoStream的使用和处置。我建议您尝试一下,并在实施IDisposable时遇到问题回到 SO。
标签: c# using-statement