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抛出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()方法.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。