2014-01-20 4 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 может сделать это для меня. Это правда, или смывает совершенно другую концепцию?

Согласно StackOverflow себя:

Флеша смысла очищает все буфера для потока и вызывает какие-либо буферизованные данные должны быть записаны в основное устройство.

Что это означает в контексте приведенного выше кода?

Во-вторых, метод промывки MemoryStreamdoes nothing according to the api, так что же с этим? почему мы называем метод, который ничего не делает?

+2

Вам не нужно делать Flush(), так как вы положили «использование»: Writer/Reader автоматически закрывает свои буферы в Close/Dispose. Flush() полезен, если вы хотите загрузить/сохранить временные результаты (скажем, половину потока) и продолжать работу с стрелками (-ами). –

ответ

8

Вам не нужно использовать Flush на StreamWriter, так как вы его утилизируете (имея его в блоке using). Когда он расположен, он автоматически очищается и закрывается.

Вам не нужно использовать Flush на MemoryStream, так как он не буферизует все, что написано в любом другом источнике. Нигде нечего смывать.

Метод Flush есть только в объекте MemoryStream, потому что он наследует от класса Stream. Вы можете видеть в source code for the MemoryStream class, что метод flush фактически ничего не делает.

2

В целом Streams будет буферизовать данные по мере их написания (периодически сбрасывая буфер на соответствующее устройство, если он есть), потому что запись на устройство, как правило, является дорогостоящим. MemoryStream записывает в оперативную память, поэтому вся концепция буферизации и промывки является избыточной. Данные всегда находятся в ОЗУ уже.

И да, избавление от потока приведет к его покраснению.

Смежные вопросы