2011-08-01 52 views
2

我不知道如何检查它,例如:在流中环绕流 - 将包装的流妥善处理?

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 

回答

2

调用close的最顶部的流瀑布关闭它们,但是这不是建议的,因为很难保持标签打开和不打开。正如另一个回答者所说的那样,虔诚地使用使用块。

希望这会有所帮助!

2

不,你不能依赖它为任何IDisposable对象设置基础流(虽然在StreamWriter的情况下它被记录为这样)。一般不要靠它。

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

+0

downvoter ....为什么?我说的是正确的,你不应该*依赖*实现IDisposable调用的对象在任何成员/参数IDisposable对象上的Dispose。 –

+0

这好像是说你不能依赖包装类不会崩溃 - 使用一个我不能依赖的框架的关键点是什么? – argh

+0

在他的例子中使用的类很好,但是如果OP采取这种表示,对于IDisposable对象的所有组合都可以,这会出现问题。 –

2

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

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

第二个问题是嵌套/包装/链接一次性类。在StreamWriter和Stream的情况下,Writer将关闭流。但是你不想知道这一点,只是使用使用模式。

一个小提示,下面的替代布局更易于阅读和维护。添加GZipStream时,你将有3个以上的嵌套块。

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

一般来说,我同意这一点,你应该避免“知识依赖”,但在这种情况下,它也被记录为发生,所以不处理内部流对象是完全安全的。 –

+0

@Lasse正确,但我倾向于避免它。除了相关的情况,比如在Writer之后使用流。 –

+0

我完全同意你的观点,即使我“知道”在这种特殊情况下无关紧要,我仍然会这样做。我从来没有想过我,也没有一位开发人员在我的代码中出现,并认为“这很奇怪”,仅仅是因为我觉得“优化”了这行代码。 –