2014-02-18 94 views
4

也许这是一个棘手的问题,但它困扰着我。如果它是重复的,不要大声赞扬 - 我试图搜索,但是有很多关于使用的问题,我很难找到答案。使用 - 我的流发生了什么?

我有这样的代码:

using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication()) 
using (StreamWriter writeFile = new StreamWriter(new IsolatedStorageFileStream("example.txt", FileMode.Create, ISF))) 
    writeFile.WriteLine("Example"); 

而且我的问题是:会发生什么我创建IsolatedStorageFileStream,当StreamWriter配置,同时采用要走了?它会被处置吗?

是否有与此相比代码的任何区别:

using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication()) 
using (IsolatedStorageFileStream stream = ISF.CreateFile("example.txt")) 
using (StreamWriter writeFile = new StreamWriter(stream)) 
    writeFile.WriteLine("Example"); 

在此先感谢。

回答

5

你有一个constructor for StreamWriter(.NET框架4.5只),允许指定leaveOpen布尔定义您的实例是否需要底层流与否的所有权。

如果未指定(如在您的示例中,或者对于框架的以前版本),默认情况下它是false,因此关闭(或处置)实例会关闭基础流。

除非你设置leaveOpen参数设置为true,则StreamWriter的 对象调用Dispose()提供的流对象时 StreamWriter.Dispose被调用。

所以有没有区别您提供的两段代码之间。

+0

@AdamHouldsworth StreamWriter本身在底层的流上调用Dispose,然后在流上调用Close。所以,是的,如果底层流实现覆盖'Close'到_not_实际关闭它不会工作流,但它是那么恕我直言,这是不值得被考虑到文档中的一个_silly_实现。 – ken2k

+0

@AdamHouldsworth,ken2k(亚当 - 我不知道为什么你已经删除回答)是的,我看到这两个答案,他们是根据问题都正确(现在是我只有一个节拍一个问题:|并没有更多的票)。总结一下,如果我编写自己的IDisposable并且不处理正确的Dispose,那么创建的流可以存活,除非它被GC收集? – Romasz

+0

@Romasz GC和Dispose实际上是两个不同的东西。 GC最终会清理您的代码中不再引用的实例; Dispose是用于立即释放(非托管)资源的手动调用。 “我自己的IDisposable”是什么意思? – ken2k

0

始终使用{}它使你的代码的意图变得更好。 代码如下:

using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    using (StreamWriter writeFile = new StreamWriter(new IsolatedStorageFileStream("example.txt", FileMode.Create, ISF))) 
    { 
     writeFile.WriteLine("Example"); 
    } 
} 

然后,您可以看到的StreamWriter在ISF的上下文中执行。如果我正确理解ISF,则在Streamwriter关闭文件时不应关闭ISF。你可以在ISF Block中打开另一个文件。

+2

不回答OP询问的问题。 – series0ne

+2

在上述情况下使用'{}'是否更好是个人意见。 – Maarten

0

一旦它离开使用块,就调用Dispose。

using Statement (C# Reference)

using语句调用在 正确的方式在对象上的Dispose方法,和(当你使用它如前所示),这也导致 对象本身走出去的范围为Dispose即将被调用。在 使用块中,该对象是只读的,不能被修改或 被重新分配。

using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。

0

即使流写入器已丢弃,您的流仍保持打开状态。例如,您可以打开另一个流写入器并继续写入流。