c# – 将’IDisposable’嵌套在一个’using’语句中

前端之家收集整理的这篇文章主要介绍了c# – 将’IDisposable’嵌套在一个’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 ),FileMode.CreateNew ) )
{
    gzip.CopyTo( outstream );
}

好奇的是,当块执行完毕时,来自“myFile.txt”的未命名的FileStream会被清除,因为它位于带有GZipStream的using语句中,或者它是否保持打开状态并且需要在此之后的某个时间进行清理.

编辑:
为了清楚起见,我不是要求使用语句进行嵌套.我问的是,在另一个IDisposable的’using’语句中创建的IDisposable是否会在块的末尾被处理掉.任何解释为什么或为什么不会被赞赏.

解决方法

它取决于构造函数,GZipStream处理您在处理它时传入的流,除非您使用其中一个接收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.

如果这是你的问题,那么答案是:不,只有被声明的对象(使用var whatever = …)将被处理,创建的任何其他对象都依赖于任何“外部”对象的代码.实现“链调用”Dispose()方法.

猜你在找的C#相关文章