Le StreamWriter.Close () indique qu'il ferme également le flux sous-jacent du StreamWriter. Qu'en est-il de StreamWriter.Dispose? Dispose également d'éliminer et / ou de fermer le flux sous-jacent
Réponses
Trop de publicités?StreamWriter.Close () appelle simplement StreamWriter.Dispose () sous le capot, donc ils font exactement la même chose. StreamWriter.Dispose () ferme le flux sous-jacent.
Le réflecteur est votre ami pour des questions comme celle-ci :)
Certaines personnes disent, juste ne pas jeter le ruisseau, c'est une très mauvaise idée, car une fois que le streamwriter est hors de portée GarbageCollection pouvez le récupérer à tout moment et jetez-il, fermant ainsi la Poignée de la rivière, mais la création d'un descendant de la classe qui remplace ce comportement de StreamWriter est facile, voici le code:
/// <summary>
/// Encapsulates a stream writer which does not close the underlying stream.
/// </summary>
public class NoCloseStreamWriter : StreamWriter
{
/// <summary>
/// Creates a new stream writer object.
/// </summary>
/// <param name="stream">The underlying stream to write to.</param>
/// <param name="encoding">The encoding for the stream.</param>
public NoCloseStreamWriter(Stream stream, Encoding encoding)
: base(stream, encoding)
{
}
/// <summary>
/// Creates a new stream writer object using default encoding.
/// </summary>
/// <param name="stream">The underlying stream to write to.</param>
/// <param name="encoding">The encoding for the stream.</param>
public NoCloseStreamWriter(Stream stream)
: base(stream)
{
}
/// <summary>
/// Disposes of the stream writer.
/// </summary>
/// <param name="disposing">True to dispose managed objects.</param>
protected override void Dispose(bool disposeManaged)
{
// Dispose the stream writer but pass false to the dispose
// method to stop it from closing the underlying stream
base.Dispose(false);
}
}
Si vous regardez à Réflecteur / ILSpy, vous trouverez que la fermeture de la base de flux est effectuée en Disposer(vrai), et lorsque la fermeture est appelée juste appelle dispose qui appelle dispose(Vrai), à partir de la il n'y aura pas d'autres effets secondaires, de sorte que la classe ci-dessus fonctionne très bien.
Vous pouvez ajouter tous les constructeurs si, j'ai juste ajouté 2 ici, pour des raisons de simplicité.
Pour citer les Framework Design Guidelines de Cwalina et Abrams dans la section sur le modèle d'élimination:
CONSIDÉRER la méthode
Close()
, en plus duDispose()
, si proche est la terminologie standard dans le domaine.
Apparemment, Microsoft suit ses propres directives, et en supposant que c'est presque toujours une valeur sûre pour la bibliothèque de classes de base .NET.