Просто для удовольствия я взломал декомпилятор, чтобы посмотреть, что Dispose делает на StreamWriter (думая, что, возможно, основной поток - единственный необходимый ресурс для удаления). Вот что получилось:
protected override void Dispose(bool disposing)
{
try
{
if (this.stream != null)
{
if (disposing || (this.Closable || this.stream as __ConsoleStream))
{
this.Flush(true, true);
if (this.mdaHelper != null)
{
GC.SuppressFinalize(this.mdaHelper);
}
}
}
}
finally
{
if (this.Closable)
{
if (this.stream != null)
{
if (disposing)
{
this.stream.Close();
}
this.stream = null;
this.byteBuffer = null;
this.charBuffer = null;
this.encoding = null;
this.encoder = null;
this.charLen = 0;
base.Dispose(disposing);
}
}
}
}
Немного многословно, но я думаю, что это говорит нам о том, что удаление потока заботится о единственном доступном ресурсе, используемом StreamWriter. Поля byteBuffer
и charBuffer
являются массивами, encoding
и encoder
не являются одноразовыми, а база Dispose
является виртуальной, поэтому Stream - единственное, что может вызвать проблемы, если он не очищен.
Я думаю, это также проясняет, что если вы хотите записать содержимое потока и впоследствии оставить его в пригодном для использования состоянии, то вы самым вызывающим образом не хотите избавиться от вашего StreamWriter, потому что это будет распоряжаться потоком (Закрыть звонки Dispose(true)
). Вы также хотите удостовериться, что вы сбрасываете положение потока, так как вы, несомненно, измените его, прочитав содержимое. Разумеется, это также означает, что вы, вероятно, захотите проверить свойство CanSeek
в Stream и убедиться, что после прочтения содержимого вы сможете вернуть положение, в котором оно было раньше.