63 votes

Le fait de disposer d'un StreamWriter ferme-t-il le flux sous-jacent?

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

63voto

Rob Levine Points 20793

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 :)

19voto

Aaron Murgatroyd Points 857

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é.

14voto

ShuggyCoUk Points 24204

Depuis StreamWriter.Close ()

 public override void Close()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}
 

De TextWriter.Dispose () (dont StreamWriter hérite)

 public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}
 

Ils sont donc identiques.

6voto

Joel Coehoorn Points 190579

Fermer et supprimer sont synonymes de StreamWriter.

2voto

Martin Liversage Points 43712

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 du Dispose() , 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X