Mel*_*viz 6 c# idisposable using-statement
关于在单个'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 );
}
Run Code Online (Sandbox Code Playgroud)
与
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 );
}
Run Code Online (Sandbox Code Playgroud)
好奇的是,当块执行完毕时,来自"myFile.txt"的未命名的FileStream会被清除,因为它位于带有GZipStream的using语句中,或者它是否保持打开状态并且需要在此之后的某个时间进行清理.
编辑:为了清楚,我不是在询问有关使用语句嵌套的问题.我问的是,在另一个IDisposable的'using'语句中创建的IDisposable是否会在块的末尾被处理掉.任何解释为什么或为什么不会被赞赏.
这取决于构造,GZipStream你通过了,当你处理的,除非你使用的一个流的处置重载,它接受一个布尔值,你在传递true到leaveOpen.
但是你这样做会冒风险.如果GZipStream抛出一个ArgumentException因为CanRead流的属性是false传入的流不会被处理掉.
就个人而言,我宁愿不依赖"不会出错的东西",而是通常采用防御性编码并使用3语句版本.
编辑:为了清楚,我不是在询问有关使用语句嵌套的问题.我问的是,在另一个IDisposable的'using'语句中创建的IDisposable是否会在块的末尾被处理掉.任何解释为什么或为什么不会被赞赏.
如果那是你的问题那么答案是:不,只有被声明的对象被分配给(using var whatever = ...),创建的任何其他对象都依赖于"外部"对象要实现的链接代码" Dispose()方法.
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |