J'envoie un flux aux méthodes sur lesquelles écrire, et dans ces méthodes, j'utilise un lecteur / rédacteur binaire. Lorsque le lecteur / écrivain est éliminé, soit par using
ou juste quand il n'est pas référencé, le flux est-il également fermé?
J'enverrais un BinaryReader / Writer, mais j'utilise aussi un StreamReader (peut-être que je devrais contourner cela. Je ne l'utilise que pour GetLine et ReadLine). Ceci est assez gênant s'il ferme le flux chaque fois qu'un écrivain / lecteur est fermé.
la source
CA2202 : Microsoft.Usage : Object 'stream' can be disposed more than once in method '...'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.
devrait-il simplement être ignoré? Je n'ai eu aucune exception jusqu'à présent ...StreamReader
. L'avertissement me semble faux, étant donné que la documentation relative à l'indication préciseIDisposable.Dispose
: "Si la méthode Dispose d'un objet est appelée plus d'une fois, l'objet doit ignorer tous les appels après le premier. L'objet ne doit pas lever d'exception si sa méthode Dispose est appelé plusieurs fois. "C'est un ancien, mais je voulais faire quelque chose de similaire aujourd'hui et j'ai constaté que les choses avaient changé. Depuis .net 4.5, il y a un
leaveOpen
argument:Le seul problème est qu'il n'est pas tout à fait évident de définir ce qu'il faut définir pour les autres paramètres. Voici de l'aide:
À partir de la page msdn pour StreamReader Constructor (Stream):
Cela laisse juste
detectEncodingFromByteOrderMarks
ce qui à en juger par le code source esttrue
Ce serait bien si certaines de ces valeurs par défaut étaient exposées ou si les arguments étaient facultatifs afin que nous puissions simplement spécifier ceux que nous voulons.
la source
using (var streamReader = new StreamReader(myStream, Encoding.UTF8, true, 1024, true))
Oui. Vous pouvez le vérifier en regardant l'implémentation avec Reflector.
la source
Six ans de retard mais peut-être que cela pourrait aider quelqu'un.
StreamReader ferme la connexion lorsqu'elle est supprimée. Cependant, "using (Stream stream = ...) {...}" avec StreamReader / StreamWriter peut entraîner la suppression du Stream deux fois: (1) lorsque l'objet StreamReader est supprimé (2) et lorsque le bloc Stream using se ferme. Cela entraîne un avertissement CA2202 lors de l'exécution de l'analyse de code de VS.
Une autre solution, tirée directement de la page CA2202 , consiste à utiliser un bloc try / finally. Configuration correctement, cela ne fermera la connexion qu'une seule fois.
Près du bas de CA2202 , Microsoft recommande d'utiliser les éléments suivants:
au lieu de...
la source
Oui. L'appel de Dispose () on et IDisposable (ce que fait "using") devrait permettre à un objet de nettoyer toutes ses ressources. Cela inclut le vidage des flux et la fermeture de leurs descripteurs de fichiers.
Si, dans votre cas, vous souhaitez le passer à d'autres méthodes, vous devez vous assurer que ces méthodes ne font pas leur lecture / écriture dans un bloc using.
la source
Un moyen simple de résoudre ce problème si vous en avez besoin est de remplacer la méthode Dispose des classes StreamWriter. Voir mon message ici pour le code sur la façon de le faire:
.Disposing a StreamWriter ferme-t-il le flux sous-jacent?
la source
le flux éliminé soit en "utilisant" le mot-clé ou en appelant explicitement dispose
la source