使用()并使用多个包装流进行处理

Lee*_*roy 3 c# dispose stream

我是对的,如果你正在做的话,你只需要一个using()用于最外层的流

MemoryStream mstr = new MemoryStream();

using(StreamWriter w = new StreamWriter(mstr)) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

由于处理StreamWriter还应该处理/关闭底层流,没有必要这样做?:

using(MemoryStream mstr = new MemoryStream())
using(StreamWriter w = new StreamWriter(mstr)) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

(注意这些只是示例,关于如何处理包装的流,而不是寻找像使用StringWriter等的替代方案)

Gre*_*ech 9

using从可读性和可维护性的角度来看,将所有依赖资源放在自己的块中是一个好主意.例如,在下面的代码中,在最后一个括号之后,不可能尝试访问,mstr因为它的范围限定在有效的块内:

using (MemoryStream mstr = new MemoryStream())
using (StreamWriter w = new StreamWriter(mstr) {
    ....
}

// cannot attempt to access mstr here
Run Code Online (Sandbox Code Playgroud)

如果你没有这样的范围,那么它仍然可以mstr在有效范围之外访问

MemoryStream mstr = new MemoryStream();
using (StreamWriter w = new StreamWriter(mstr) {
    ....
}

mstr.Write(...); // KABOOM! ObjectDisposedException occurs here!
Run Code Online (Sandbox Code Playgroud)

因此虽然它可能并不总是必要的(并且在这种情况下它不是),但它是一个好主意,因为它既阐明并强制执行您对其范围的意图.


Phi*_*eck 7

我的经验法则:如果它实现了IDisposable,请将其丢弃.

虽然当前(可能永远),调用StreamWriter.Dispose()关闭底层流,但您将来可能使用的其他流派生类可能不会.此外,它似乎也没有实际调用Dispose(),因此非MemoryStreams可能无法正确处理(尽管我现在无法想到任何会受到影响的东西).

因此,虽然您可以安全地只处理StreamWriter,但我发现在可能的情况下始终使用块用于一次性用品是一种更好的做法.

  • Stream.Close()说:“此方法调用Dispose,将其指定为true以释放所有资源。” 换句话说,在Stream上调用Close()会自动在其上调用Dispose(true)。 (2认同)