2014-01-20 50 views
2

我用下面的代码片段,我不确定我是否需要调用Flush方法(一次在StreamWriter,一旦MemoryStream):C#冲洗的StreamWriter和一个MemoryStream

//converts an xsd object to the corresponding xml string, using the UTF8 encoding 
    public string Serialize(T t) 
    { 
     using (var memoryStream = new MemoryStream()) 
     { 
      var encoding = new UTF8Encoding(false); 

      using (var writer = new StreamWriter(memoryStream, encoding)) 
      { 
       var serializer = new XmlSerializer(typeof (T)); 
       serializer.Serialize(writer, t); 
       writer.Flush(); 
      } 

      memoryStream.Flush(); 

      return encoding.GetString(memoryStream.ToArray()); 
     } 
    } 

首先, ,因为代码位于using块内,我认为自动调用dispose方法可能会为我执行此操作。这是真的,还是冲淡一个完全不同的概念?

根据计算器本身:

冲洗含义清除一个流的所有缓冲区并使所有缓冲数据被写入到下面的设备。

在上面的代码中,这意味着什么?

其次,冲洗方法的MemoryStreamdoes nothing according to the api,所以这是怎么回事?为什么我们要调用一种什么都不做的方法?

+2

您不必做Flush(),因为您已经放入了“使用”:Writer/Reader将在Close/Dispose中自动关闭它们的缓冲区。如果你想加载/保存时间结果(比如一半的流)并且继续使用streem(s),Flush()是有用的。 –

回答

8

你并不需要在StreamWriter使用Flush,因为你是它配置(通过在using块有它)。处置完成后,会自动刷新并关闭。

您不需要在MemoryStream上使用Flush,因为它不会缓冲写入其他任何源的任何内容。没有什么可以冲洗的地方。

Flush方法只存在于MemoryStream对象中,因为它继承自Stream类。您可以在source code for the MemoryStream class中看到flush方法实际上什么都不做。

2

一般来说,Streams会在数据写入时缓冲数据(周期性地将缓冲区刷新到关联的设备,如果有的话),因为写入设备,通常是文件,很昂贵。一个MemoryStream写入RAM,所以缓冲和刷新的整个概念是多余的。数据总是在RAM中。

是的,处置流将导致它被刷新。