内部using语句关闭后如何在外部using语句中声明的MemoryStream仍然可用?

问题描述 投票:0回答:1

Microsoft文档在此页面上具有以下代码:

https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.cryptostream?view=netframework-4.7

最内部的“使用”语句假定要处理csEncrypt,而这又假定要处理msEncrypt流。但是,紧接在最内部的using语句作用域之后,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();
    }
}
c# memorystream using-statement cryptostream
1个回答
1
投票

如果对象的Dispose方法被多次调用,则该对象必须忽略第一个之后的所有调用。如果多次调用其Dispose方法,则该对象不得引发异常。大多数人甚至建议禁止显示此警告。更多信息here。您的代码的重构版本可能是这样的:

MemoryStream msEncrypt = new MemoryStream();

CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);

StreamWriter swEncrypt = new StreamWriter(csEncrypt)

//Write all data to the stream.
swEncrypt.Write(plainText);
encrypted = msEncrypt.ToArray();

//Do more work if needed.
//if you need to dispose of them manually and the current scope hasn't ended then just do:
swEncrypt.Dispose();

或者如果您想维护using语句,则遵循模式here

© www.soinside.com 2019 - 2024. All rights reserved.