web-dev-qa-db-fra.com

Dois-je fermer explicitement le StreamReader en C # lors de son utilisation pour charger un fichier dans une variable de chaîne?

Exemple:

variable = new StreamReader( file ).ReadToEnd();

Est-ce acceptable?

33
Matt Ralston

Non, cela ne fermera pas le StreamReader. Vous devez le fermer. L'utilisation fait cela pour vous (et le supprime pour qu'il soit GC plus tôt):

using (StreamReader r = new StreamReader("file.txt"))
{
  allFileText = r.ReadToEnd();
}

Ou bien, dans .Net 2, vous pouvez utiliser le nouveau fichier. membres statiques, vous n'avez rien à fermer:

variable = File.ReadAllText("file.txt");
44
badbod99

Vous devez toujours disposer de vos ressources.

// the using statement automatically disposes the streamreader because
// it implements the IDisposable interface
using( var reader = new StreamReader(file) )
{
    variable = reader.ReadToEnd();
}

Ou du moins l'appeler manuellement:

reader = new StreamReader(file);
variable = reader.ReadToEnd();
reader.Close();
19
Dismissile

Vous devez supprimer les objets qui implémentent IDisposable. Utilisez une instruction using pour vous assurer qu'elle est supprimée sans appeler explicitement la méthode Dispose.

using (var reader = new StreamReader(file))
{
  variable = reader.ReadToEnd();
}

Alternativement, utilisez File.ReadAllText(String)

variable = File.ReadAllText(file);
6
Greg

Oui, chaque fois que vous créez un objet jetable, vous devez en disposer de préférence avec une instruction using

using (var reader = new StreamReader(file)) {
  variable = reader.ReadToEnd(file);
}

Dans ce cas, vous pouvez simplement utiliser le File.ReadAllText méthode pour simplifier l'expression

variable = File.ReadAllText(file);
4
JaredPar

Il est recommandé de fermer StreamReader. Utilisez le modèle suivant:

string contents;

using (StreamReader sr = new StreamReader(file)) 
{
   contents = sr.ReadToEnd();
}
0
Bernard

Il vaut mieux utiliser le mot-clé sing; vous n'avez alors pas besoin de fermer explicitement quoi que ce soit.

0
Paul Sonier