С#, сбрасывающий StreamWriter и MemoryStream

Я использую следующий фрагмент кода, и я не уверен, что мне нужно вызвать методы Flush (один раз на 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:

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

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

Во-вторых, метод flush MemoryStream ничего не делает в соответствии с api, так что с этим? почему мы называем метод, который ничего не делает?

Ответ 1

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

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

Метод Flush присутствует только в объекте MemoryStream, поскольку он наследуется от класса Stream. Вы можете увидеть в исходный код для класса MemoryStream, что метод Flush фактически ничего не делает.

Ответ 2

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

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