在流中包裹流 - 包裹的流是否会正确处理?

时间:2011-08-01 13:45:25

标签: c# stream dispose wrapping

我不知道如何检查它,例如:

using (var stream = new StreamWriter(someStream))
{
    stream.Write("");
}

这样做会是这样的:

using (var stream1 = someStream)
{
    using (var stream2 = new StreamWriter(stream1))
         stream.Write("");
}

或者如果我将其包装到GZipStream或任何其他流中......第一个示例是否会处理每个底层流?

更新

最后它击中了我 - 我自己实现了Stream类:

class MyStream : Stream
{
    // fake stream implementation

    protected override void Dispose(bool disposing)
    {
        Console.WriteLine("disposing in my class");
        base.Dispose(disposing);
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyStream stream = new MyStream();
        DoSomething(stream);
        stream.Dispose();

        Console.WriteLine("end of program");
    }

    private static void DoSomething(Stream stream)
    {
        using (var writer = new StreamWriter(stream))
        {
            Console.WriteLine("inside using statement");
        }

        Console.WriteLine("after writing");
    }
}

结果:

inside using statement
disposing in my class
after writing
disposing in my class
end of program

3 个答案:

答案 0 :(得分:2)

在最顶端的流上调用关闭并将关闭它们全部,但不建议这样做,因为很难保持打开什么不打开。正如另一位回答者所说,虔诚地使用使用块。

希望这有帮助!

答案 1 :(得分:2)

不,你不能依赖它为任何IDisposable对象处理基础流(尽管在StreamWriter的情况下,它会被记录下来)。一般不要依赖它。

您应该使用嵌套的using语句。

答案 2 :(得分:2)

你在这里混合了两个概念。

主要是使用块嵌套,而在第2个示例中,您正确使用它们。

第二个问题是嵌套/包装/链接的一次性类。对于StreamWriter和Stream,Writer将关闭Stream。但你不想知道,只需使用使用模式。

小提示,以下替代布局更易于阅读和维护。添加GZipStream时,您将拥有3个嵌套使用块。

using (var stream1 = File.Create(...))
using (var stream2 = new StreamWriter(stream1))
{    
         stream2.Write("");
}