关于在单个“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 );
}
vs.
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 );
}
只是好奇当该块执行完毕时,“myFile.txt”中的未命名 FileStream 是否会被清理,因为它位于 GZipStream 的 using 语句中,或者它保持打开状态并且需要在之后的某个时间清理。
编辑:
需要明确的是,我并不是在询问嵌套 using 语句。我问的是,在另一个 IDisposable 的“using”语句中创建的 IDisposable 是否会在块末尾被释放。任何关于为什么或为什么不的解释将不胜感激。
这取决于构造函数,GZipStream
处置您在处置时传入的流,除非您使用其中之一超载接受一个布尔值,然后你传入true
to leaveOpen
.
然而,这样做确实有风险。如果GZipStream
抛出一个ArgumentException
因为CanRead
流的属性是false
传入的流不会被丢弃。
就我个人而言,我宁愿不依赖“不会出错的事情”,而是通常进行防御性编码并使用 3 语句版本。
编辑:为了明确起见,我不是在询问嵌套 using 语句。
我问的是里面是否创建了一个 IDisposable
另一个 IDisposable 的 'using' 语句将在最后被处理
块的。任何关于为什么或为什么不的解释将不胜感激。
如果这是您的问题,那么答案是:不,只有声明的对象被分配给 (using var whatever = ...
)将被处置,创建的任何其他对象都依赖于要实现“链调用”的“外部”对象的代码Dispose()
方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)