Dois-je appeler Close() ou Dispose() pour les objets de flux?

Classes telles que Stream, StreamReader, StreamWriter etc implémente IDisposable interface. Cela signifie que nous pouvons appeler Dispose() méthode sur des objets de ces classes. Ils ont également défini un public méthode appelée Close(). Maintenant que me confond, à quoi dois-je appeler une fois que je suis fait avec des objets? Que faire si je appeler?

Mon code actuel est: est-ce

using (Stream responseStream = response.GetResponseStream())
{
   using (StreamReader reader = new StreamReader(responseStream))
   {
      using (StreamWriter writer = new StreamWriter(filename))
      {
         int chunkSize = 1024;
         while (!reader.EndOfStream)
         {
            char[] buffer = new char[chunkSize];
            int count = reader.Read(buffer, 0, chunkSize);
            if (count != 0)
            {
               writer.Write(buffer, 0, count);
            }
         }
         writer.Close();
      }
      reader.Close();
   }
}

Comme vous le voyez, j'ai écrit using() des constructions, qui appelle automatiquement Dispose() méthode sur chaque objet. Mais j'ai aussi appeler Close() méthodes. Est-il juste?

Merci de me suggérer les meilleures pratiques lors de l'utilisation d'objets de flux. 🙂

MSDN exemple ne pas utiliser using() constructions, et d'appeler Close() méthode:

Est-il bon?

  • Si vous êtes à l'aide de ReSharper vous pourrait la définir comme une "antipattern" dans la formulation de catalogue. ReSharper marquera chaque utilisation d'erreur/indicateur/avertissement quant à votre définition. Il est également possible de définir la façon dont ReSharper est d'appliquer un QuickFix pour un tel événement.
  • Juste un conseil: Vous pouvez utiliser l'instruction à l'aide comme ça pour plusieurs jetables itens: à l'aide de flux (Stream responseStream = réponse.GetResponseStream()) using (StreamReader reader = new StreamReader(responseStream)) à l'aide de (StreamWriter writer = new StreamWriter(filename)) { //...code }
  • double possible de Ne Stream.Disposer toujours d'appel de Flux.De près (et de Flux.Flush)
  • Vous n'avez pas besoin de votre nid à l'aide des déclarations comme ça, on peut les empiler l'un sur l'autre et ont une série de crochets. Sur un autre post, j'ai proposé une modification pour un extrait de code qui devrait avoir l'aide d'instructions avec cette technique si vous souhaitez regarder et corriger votre code de "flèche": stackoverflow.com/questions/5282999/...
  • Vous avez à votre nid using ce genre de déclaration. using permet à un seul type, même si vous sont en cours d'initialisation des ressources multiples dans la même instruction. Si vous utilisez plusieurs états ou de plusieurs types, par définition, vous devez nid using états; ici, les objets sont de types différents et doivent être dans des using consolidés.
  • Vous pouvez avoir plusieurs à l'aide de relevés, mais pas les imbriquer et au lieu de les empiler. Je ne parle pas de la syntaxe comme ce qui limite le type: using (MemoryStream ms1 = new MemoryStream(), ms2 = new MemoryStream()) { }. Je veux dire que c'est là où vous pouvez redéfinir le type: using (MemoryStream ms = new MemoryStream()) using (FileStream fs = File.OpenRead("c:\\file.txt")) { }
  • Désolé d'être pointilleux, mais ceux-ci déclarations sont imbriqués.

InformationsquelleAutor Nawaz | 2011-09-23