2016-05-06 1 views
1

J'utilise souvent le bloc "using" pour disposer les objets. Aujourd'hui, j'utilise HttpWebRequest pour publier des données, et je me sens confus entre deux méthodes.confus lors de l'utilisation de "using block" - C#

Méthode 1:

var request = (HttpWebRequest)WebRequest.Create("http://www..."); 
using (var writer = new StreamWriter(request.GetRequestStream())) 
{ 
    writer.Write(JsonConvert.SerializeObject(content)); 
} 

Méthode 2:

var request = (HttpWebRequest)WebRequest.Create("http://www..."); 
using (var stream = request.GetRequestStream()) 
using (var writer = new StreamWriter(stream)) 
{ 
    writer.Write(JsonConvert.SerializeObject(content)); 
} 

Dans la méthode 2, tous les cours d'eau et streamwirter en blocs "à l'aide", donc elle le sera certainement en disposer. Mais dans la méthode 1, je ne suis pas sûr flux request.GetRequestStream() sera disposer. Quelqu'un peut-il m'expliquer? Merci beaucoup!

Répondre

9

Fondamentalement, cela dépend de deux choses:

  • Que le constructeur StreamWriter sera jamais jeter une exception lorsqu'il est passé une référence Stream non nulle - et je ne pense pas que ce sera dans ce cas. (Si le flux était en lecture seule, il serait ... à quel point le flux ne serait pas disposé.)
  • Si StreamWriter.Dispose dispose du flux sous-jacent - et il le fait, sauf si vous avez appelé le constructor overload qui explicitement vous permet de contrôler que

donc, fondamentalement, je crois qu'il est sûr dans ce cas ... lorsque votre déclaration using dispose du StreamWriter, qui disposera de la Stream. Comme indiqué dans les commentaires, cependant, l'utilisation de deux instructions using signifie que vous n'avez pas besoin d'effectuer ce type de raisonnement.

+0

Ainsi, la méthode 1 est aussi sûre que la méthode 2? –

+0

@MinhGiang: Oui, exactement. –

+0

Etes-vous sûr de ça? Si Stream.CanWrite est faux pour une raison quelconque (quelque chose d'imprévisible se produit avec la requête), le constructeur StreamWriter lancera ArgumentException et le flux sous-jacent pourrait ne pas être éliminé. Cela ne veut pas dire qu'il est probable que cela se produise, mais que certaines pratiques (comme la méthode 1) vous obligent à réfléchir à des implémentations particulières (qui pourraient aussi changer à l'avenir, bien sûr) et que certaines pratiques ne le font pas. C'est la raison pour laquelle je choisirais toujours personnellement la méthode 2. –

5

Un StreamWriter en fermant un Stream ferme ce flux lorsqu'il est fermé. Voir le docs.

-2

Les deux sont les mêmes. Depuis en utilisant le bloc dispose de l'objet entier, même les objets anonymes.

+0

Non, ce ne sont pas les mêmes. L'instruction 'using' appelle uniquement' Dispose' sur les ressources spécifiées dans la première partie - ce code est * seulement * correct car 'StreamWriter' appelle' Dispose' sur le 'Stream' qui est passé dans le constructeur. –

+0

Cela semble être vrai. J'ai lu https://msdn.microsoft.com/es-es/library/system.idisposable.dispose(v=vs.110).aspx. Je vous remercie – taquion