c# - 在单个 'IDisposable' 语句中嵌套 'using'

标签 c# idisposable using-statement

关于在单个“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/

相关文章:

c# - 删除和/或排序 Usings 的值(value)是什么?

c# - 为什么禁用延迟加载会导致相关表没有结果?

c# - 我怎么能在第一个位置有一个空项目的十进制组合框?

c# - 与严格的 OO 语言相比,您更喜欢 Python 的哪些应用程序或问题类别?

c# - 将 ComboBox 列添加到具有相同数据源的 DataGridView 时出现 ArgumentException

c# - C# 的 using 语句中止安全吗?

c# - System.ServiceModel.ServiceHost 实现 IDisposable 但 Dispose 不公开

c# - 哪个更好,什么时候: using statement or calling Dispose() on an IDisposable in C#?

c# - 是否有为 using 语句实现 IDisposable 的公共(public)对象列表?

c# - 何时隐式调用 `Dispose`来重构: using statement without scope,?