【发布时间】:2016-04-12 09:23:36
【问题描述】:
关于在单个“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 );
}
只是好奇当块执行完毕后,“myFile.txt”中未命名的 FileStream 是否会被清理,因为它在 GZipStream 的 using 语句中,或者它是否保持打开状态并需要在此之后的某个时间进行清理。
编辑: 为了清楚起见,我不是在问嵌套 using 语句。我在问在另一个 IDisposable 的“使用”语句中创建的 IDisposable 是否会在块的末尾被处理掉。任何关于为什么或为什么不的解释将不胜感激。
【问题讨论】:
-
如果 FileStream 构造函数成功但 GZipStream 构造函数失败,那么,哎呀。
-
也许值得设置一组非常简单的实现 IDisposable 的虚拟类并观察调试器中发生的情况?
-
第二个例子中没有明确处理第一个
FileStream对象。当 那个 对象被处置时,它可能 被GZipStream对象处置,但是像第一个示例中那样自己显式处置它似乎更合理。 -
请注意,如果正确实施,Dispose 是幂等的。不小心“双重处置”一个对象绝不是错误的。因此,我可能会犯更多的处置错误,而不是更少。
标签: c# idisposable using-statement