C#嵌套的流与using语句,我应该使用两个using吗?

3

我正在编写一段使用嵌套流的代码:

using (var zip = new ZlibStream(new MemoryStream(to_be_unziped), CompressionMode.Decompress))
{

}

这样可以吗?还是我应该写成这样:
using (var memory_stream = new MemoryStream(to_be_unziped))
using (var zip = new ZlibStream(memory_stream, CompressionMode.Decompress))
{

}

1
第一种方法没有问题,但我认为第二种方法更易读。但在第二种方法中应该只是“memory_stream”,而不是“var memory_stream”。 - TheLastStark
1
您不需要处理MemoryStream。 - JohanP
谢谢大家的评论!有人可以写一个答案让我采纳吗? - Just a learner
@TheLastStark 如果你不想让它被释放,你必须将leaveOpen参数设置为true,这样它将由ZlibStream实例处理。 - Sir Rufo
@SirRufo 它会和 ZlibStream 一起被处理掉,而不是在之前? - TheLastStark
显示剩余7条评论
1个回答

2
当您创建一个ZlibStream并传递MemoryStream时,它将持有对它的引用。当它被Disposed时,它会调用该引用上的Close,这将会触发抽象的Stream类中的Dispose管道机制。"Original Answer"可以翻译成"最初的回答"。
protected override void Dispose(bool disposing)
{
    try
    {
        if (!_disposed)
        {
            if (disposing && (this._baseStream != null))
                this._baseStream.Close();
            _disposed = true;
        }
     }
     finally
     {
        base.Dispose(disposing);
     }
}

值得注意的是,MemoryStream 没有非托管资源,实际上不需要 Disposed,它不会 override Stream 类的 Close 方法。 Stream 还会检查是否已经调用了 Dispose。这意味着在大多数情况下,你只需要处理你正在使用的 stream

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接