2010-11-16 6 views
4

Comme MemoryStream est une ressource non gérée, doit-elle toujours être éliminée?MemoryStream doit être explicitement éliminé?

Étant donné:

1) A method is invoked. 
2) A MemoryStream object is created (MemoryStream ms = new MemoryStream();). 
3) An exception occurs and is caught from the invoking classes. 

La référence sur l'objet MemoryStream est donc perdu. Ce scénario nécessite-t-il un try/finally-block (ou using-statement)?

+0

Je voulais juste dire Bonobo est génial. – Dave

Répondre

2

Tout type qui implémente IDisposable doit avoir Dispose appelé explicitement via un bloc try/catch/finally ou via l'instruction using.

Il existe des cas comme celui-ci où techniquement le MemoryStream n'a pas besoin d'être éliminé, cependant pour honorer l'interface et vous protéger contre les modifications en aval Dispose doit toujours être appelé.

1

MemoryStream implémente IDisposable alors si possible, utilisez une instruction using.

Lorsque cela n'est pas possible, faites-en un bloc try/catch/finally.

Dans les cas où vous devez laisser l'objet sortir du champ de votre code (lorsque vous utilisez ou essayez/catch/finally ne fonctionnera pas), il incombe à l'appelant d'implémenter la disposition explicite.

12

En général, tous les objets jetables doivent toujours être éliminés.

Cependant, MemoryStream n'a pas vraiment besoin d'être éliminé, car il ne dispose pas de ressources non managées. La seule raison pour laquelle il est jetable en premier lieu est qu'il hérite de la classe abstraite Stream, qui implémente IDisposable.

Notez que chaque autre flux doit être éliminé.

+3

Désaccord que vous ne devez pas appeler Dispose dans ce cas, alors qu'il n'est peut-être pas "nécessaire" le fait est qu'il implémente l'interface IDisposable et qu'il doit être appelé via try ou catch/finally car les détails d'implémentation changer à un certain point et puisque vous avez négligé d'honorer l'interface, vous pourriez obtenir peu par un bug qui aurait pu être évité –

+2

@Aaron: Dans ce cas particulier, c'est ** hautement ** peu probable. – SLaks

+1

D'accord ... mais il s'agit de rendre les comportements habituels. Les gens qui n'utilisent pas leur clignotant parce qu'il n'y a pas de voiture réfléchissent consciemment à l'action; ce n'est plus un comportement habituel et ils oublieront à un moment donné. –

-1

Voir ici Avoiding Problems with the Using Statement

Regarda l'IL et using ce que cela:

try 
{ 
}finally 
{ 
((System.IDisposable)obj).Dispose(); 
} 

Ce qui signifie que votre flux va se disposés peu importe, mais l'exception (si elle se produit dans le bloc d'essai) restera sur la pile afin qu'il puisse vous planter app si vous ne prenez pas soin.

Donc: "La référence sur l'objet MemoryStream est donc perdue Est-ce que ce scénario nécessite un try/finally-block (ou using-statement)?" - Son même

Maintenant, ce ce qui est vraiment intéressant qui se passerait si la méthode Dispose échoue pour une raison- vous avez un trou de sécurité IE :) :) Kidding