gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:08:15 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com