Comprendre les flux et leur durée de vie (rincer, éliminer, Fermer)

Note: j'ai déjà lu les deux questions suivantes:

Pouvez-vous expliquer le concept de flux?

C # en utilisant les flux

JE CODE en C #

  1. dans presque tous les échantillons de code qui utilisent des flux, .Disposer(), .Flush(), .Close () sont presque toujours appelés.
    • dans le concept d'un flux, qu'est-ce qui accomplit?
    • Si Je ne dispose pas d'un flux que j'ai stocké dans une variable, mon application fuit-elle quelque part?
    • Pourquoi dois-je appeler l'une de ces fonctions? J'ai vu des exemples de code qui ne le font pas et font toujours le travail (sans rupture apparente )

Je construis actuellement une classe dans mon application qui contient une méthode primaire (appelons-la GetStream()) qui renvoie un flux via myWebRequest.GetResponse().GetResponseStream()

La méthode primaire GetStream() renvoie un objet Stream qui peut être utilisé pour toute opération nécessitant un flux (StreamReader, Bitmap (), etc.).

Est-il un moyen de avoir le flux Éliminés automatiquement après sa dernière utilisation (ordures ménagères collectées?) sans forcer quiconque appelle .GetStream() à en disposer manuellement?

Comme vous pouvez probablement le dire, mes questions sont vagues et générales. Ma compréhension des flux n'est pas solide, donc tout lien vers des articles utiles qui offrent un regard plus approfondi sur les flux qu'une question SO peut offrir serait apprécié.

22
demandé sur Community 0000-00-00 00:00:00

1 réponses

Disposer d'un flux le ferme (et ne fait probablement pas grand-chose d'autre.) La fermeture d'un flux le vide et libère toutes les ressources liées au flux, comme un handle de fichier. Le vidage d'un flux prend toutes les données tamponnées qui n'ont pas encore été écrites et les écrit immédiatement; certains flux utilisent la mise en mémoire tampon en interne pour éviter de faire une tonne de petites mises à jour de ressources relativement coûteuses comme un fichier disque ou un tuyau réseau.

Vous devez appeler Close ou Dispose sur la plupart des flux, ou votre le code est incorrect, car la ressource sous-jacente ne sera pas libérée pour que quelqu'un d'autre l'utilise jusqu'à ce que le garbage collector Vienne (qui sait combien de temps cela prendra.) Dispose est préféré comme une question de cours; il est prévu que vous allez disposer toutes les choses jetables en C#. Vous n'avez probablement pas besoin d'appeler Flush explicitement dans la plupart des scénarios.

En C#, il est idiomatique d'appeler Dispose au moyen d'un bloc using, qui est du sucre syntaxique pour un bloc try-finally qui dispose dans le finally, par exemple:

using (FileStream stream = new FileStream(path))
{
    // ...
}

Est fonctionnellement identique à

FileStream stream;

try
{
    stream = new FileStream(path);
    // ...
}
finally
{
    if (stream != null)
        stream.Dispose();
}
31
répondu mquander 2014-10-07 11:50:01