Быстрый переход в Reflector.NET показывает, что метод Close()
в StreamWriter
имеет вид:
public override void Close()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
А StreamReader
составляет:
public override void Close()
{
this.Dispose(true);
}
Переопределение Dispose(bool disposing)
в StreamReader
:
protected override void Dispose(bool disposing)
{
try
{
if ((this.Closable && disposing) && (this.stream != null))
{
this.stream.Close();
}
}
finally
{
if (this.Closable && (this.stream != null))
{
this.stream = null;
/* deleted for brevity */
base.Dispose(disposing);
}
}
}
Метод StreamWriter
аналогичен.
Итак, читая код, становится ясно, что вы можете вызывать Close()
& Dispose()
в потоках так часто, как вам нравится, и в любом порядке. Это никак не изменит поведение.
Таким образом, все сводится к тому, является ли более читабельным использование Dispose()
, Close()
и / или using ( ... ) { ... }
.
Мое личное предпочтение заключается в том, что using ( ... ) { ... }
всегда следует использовать, когда это возможно, поскольку это помогает вам "не бегать с ножницами".
Но, хотя это помогает правильности, оно снижает читабельность. В C # у нас уже есть множество закрывающих фигурных скобок, так как мы узнаем, какая из них на самом деле выполняет закрытие в потоке?
Так что я думаю, что лучше всего сделать это:
using (var stream = ...)
{
/* code */
stream.Close();
}
Это не влияет на поведение кода, но способствует удобочитаемости.