关于在单个“using”语句中使用嵌套一次性用品的快速问题:我应该写出每个一次性用品的 using 语句,还是可以将它们嵌套成一个?示例:
using( FileStream inFile = new FileStream( "myFile.txt", FileMode.Open ) )
using( GZipStream gzip = new GZipStream( inFile, CompressionMode.Decompress ) )
using( FileStream outFile = new FileStream( "myNewFile.txt", FileMode.CreateNew ) )
{
gzip.CopyTo( outstream );
}
对比
using( GZipStream gzip = new GZipStream( new FileStream( "myFile.txt", FileMode.Open ), CompressionMode.Decompress ) )
using( FileStream outFile = new FileStream( "myNewFile.txt", FileMode.CreateNew ) )
{
gzip.CopyTo( outstream );
}
只是想知道当 block 执行完毕时,来自“myFile.txt”的未命名 FileStream 是否被清理,因为它在 GZipStream 的 using 语句中,或者它是否保持打开状态并且需要在之后的某个时间清理。
编辑: 需要说明的是,我不是在询问嵌套 using 语句。我在问在另一个 IDisposable 的“using”语句中创建的 IDisposable 是否会在 block 的末尾被处理掉。任何关于为什么或为什么不的解释将不胜感激。
最佳答案
这取决于构造函数,GZipStream
在处理时处理您传入的流,除非您使用 overloads 之一它接受一个 bool 值,然后将 true
传递给 leaveOpen
。
但是这样做确实存在风险。如果 GZipStream
抛出 ArgumentException
因为流的 CanRead
属性是 false
传入的流不会被释放的。
就我个人而言,我宁愿不依赖于“不会出错”,而是通常采用防御性编码并使用 3 语句版本。
Edit: Just to be clear, I'm not asking about nesting using statements. I'm asking whether or not an IDisposable that is created inside another IDisposable's 'using' statement will be disposed of at the end of the block. Any explanation on why or why not would be appreciated.
如果这是你的问题,那么答案是:不,只有声明的对象被分配给(using var whatever = ...
)将被释放,任何其他创建的对象都依赖于任何“外部”对象的代码都将被实现为“链式调用”Dispose()
方法。
关于c# - 在单个 'IDisposable' 语句中嵌套 'using',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34664433/