我不知道如何检查它,例如:
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
答案 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("");
}