使用 - 我的流发生了什么?

时间:2014-02-18 09:26:54

标签: c# dispose

也许这是一个琐碎的问题,但这让我很困扰。如果它是重复的话,不要大喊大叫 - 我试图搜索,但是有很多关于使用的问题,我很难找到答案。

我有这样的代码:

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");

提前致谢。

4 个答案:

答案 0 :(得分:5)

您有一个constructor for StreamWriter(仅限.NET Framework 4.5),它允许指定leaveOpen布尔值,用于定义您的实例是否拥有基础流的所有权。

如果未指定(如您的示例或框架的先前版本),默认情况下为false,因此关闭(或处置)实例将关闭基础流。

  

除非将leaveOpen参数设置为true,否则为StreamWriter   对象在提供的Stream对象上调用Dispose()   调用StreamWriter.Dispose。

因此,您提供的两段代码之间存在无差异

答案 1 :(得分:0)

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

using Statement (C# Reference)

  

using语句在对象中调用Dispose方法   正确的方式,(当你使用它如前所示)它也会导致   一旦调用Dispose,对象本身就会超出范围。内   使用块,该对象是只读的,不能修改或   重新分配。

     

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

始终使用{}!它使您的代码的意图更好。 您的代码如下:

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中打开另一个文件。