50 votes

Faut-il appeler Flush() sur un flux ou un écrivain si l'on utilise l'instruction "using" ?

Je ne sais pas si je dois appeler Flush() sur les objets utilisés si j'écris quelque chose comme ça :

using (FileStream...)
using (CryptoStream...)
using (BinaryWriter...)
{
    // do something
}

La chasse d'eau est-elle toujours automatique ? Quand est-ce que le using et quand il ne le fait pas (si cela peut arriver) ?

62voto

Davide Piras Points 28708

Dès que vous quittez la portée du bloc using, le flux est fermé et éliminé. Le Close() appelle le Flush(), vous ne devriez donc pas avoir besoin de l'appeler manuellement.

0 votes

La fin de l'utilisation des appels est proche ? Je sais seulement qu'il dispose du flux, et j'appelle la méthode close à la fin à chaque fois.

9 votes

Ce n'est pas nécessaire, Dispose ferme toujours le flux, et Close vide d'abord le flux.

1 votes

@FelixCzylwik : si la fin de l'utilisation n'appelait pas Close, vous auriez des tonnes de flux ouverts et de connexions SQLConnections ouvertes... :D

-4voto

TheHitchenator Points 253

Cela varie, Stream par défaut n'appelle pas Flush() dans le Dispose à quelques exceptions près, telles que FileStream . La raison en est que certains objets de flux n'ont pas besoin d'appeler la fonction Flush car ils n'utilisent pas de tampon. Certains, tels que MemoryStream remplacer explicitement la méthode pour s'assurer qu'aucune action n'est entreprise (ce qui en fait un no-op).
En d'autres termes, si vous préférez ne pas avoir d'appel supplémentaire, vous devez vérifier si l'adresse de l'appelant est la même que celle de l'appelant. Stream que vous utilisez met en œuvre l'appel dans le fichier Dispose et si elle est nécessaire ou non.

Quoi qu'il en soit, il peut être judicieux de l'appeler quand même, juste pour la lisibilité - de la même manière que certaines personnes appellent Close() à la fin de leurs déclarations d'utilisation :

using (FileStream fS = new FileStream(params))
using (CryptoStream cS = new CryptoStream(params))
using (BinaryWriter bW = new BinaryWriter(params))
{
    doStuff();
    //from here it's just readability/assurance that things are properly flushed.
    bW.Flush();
    bW.Close();
    cS.Flush();
    cS.Close();
    fS.Flush();
    fS.Close();
}

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