Вам нужно вызывать Flush () для потока или записи, если вы используете оператор «using»? - PullRequest
41 голосов
/ 10 октября 2011

Я не уверен, нужно ли мне вызывать Flush() для использованных объектов, если я напишу что-то вроде этого:

using (FileStream...)
using (CryptoStream...)
using (BinaryWriter...)
{
    // do something
}

Они всегда автоматически сбрасываются? Когда оператор using сбрасывает их, а когда нет (если это может произойти)?

Ответы [ 2 ]

49 голосов
/ 10 октября 2011

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

0 голосов
/ 23 января 2018

Это меняется, Stream по умолчанию не вызывает Flush() в методе Dispose с несколькими исключениями, такими как FileStream. Причина этого заключается в том, что некоторым объектам потока не требуется вызов Flush, поскольку они не используют буфер. Некоторые, такие как MemoryStream, явно переопределяют метод, чтобы гарантировать, что никакие действия не предпринимаются (что делает его недоступным).
Это означает, что если вы не хотите иметь дополнительный вызов, вам следует проверить, реализует ли используемый вами подкласс Stream метод в методе Dispose и нужен ли он или нет.

Несмотря на это, в любом случае, было бы неплохо назвать его просто для удобства чтения - подобно тому, как некоторые люди называют Close() в конце своих операторов использования:

using (FileStream fS = new FileStream(params))
using (CryptoStream cS = new CryptoStream(params))
using (BinaryWriter bW = new BinaryWriter(params))
{
    doStuff();
    //from here it's just readability/assurance that things are properly flushed.
    bW.Flush();
    bW.Close();
    cS.Flush();
    cS.Close();
    fS.Flush();
    fS.Close();
}
...