2017-10-20 21 views
0

je la classe suivante dérivée de flux:flux dérivé contenant Mise au rebut des ruisseaux

public class EncryptedStream : Stream 
{ 
    private readonly SymmetricAlgorithm _engine; 
    private readonly CryptoStream _cryptoStream; 
    private readonly Stream _inputStream; 

    //Standard overrides of stream 
} 

Je cherche un moyen de l'éliminer le flux de base et tous les cours d'eau et des ressources au sein de cette classe. J'ai lu sur le modèle Éliminez un peu, et comme flux implémente déjà IDisposable, ma pensée serait de disposer dans cette classe que je ferais ce qui suit:

protected override void Dispose(bool disposing)   
{ 
    if (disposing) 
    { 
     _engine.Dispose(); 
     _cryptoStream.Dispose(); 
     _inputStream.Dispose(); 
    } 
} 

Cela devrait s'appelé lors de l'élimination du flux de base depuis le flux de base IDisposable appelle Close() qui appelle Dispose (true).

Cela semble fonctionner, y a-t-il des inconvénients à cette approche? Et aussi, ai-je besoin d'appeler base.Dispose (disposition) après l'instruction If? Je ne pense pas que ce soit déjà fait en appelant Dispose sur le flux de base en premier lieu correct?

Y a-t-il d'autres façons moins compliquées de procéder à cette élimination, car cela m'a pris du temps à comprendre.

Répondre

1

Ce que vous avez est bon. Pas besoin d'appeler le Stream::Dispose(bool), c'est une méthode virtuelle avec un corps vide.

Je vous recommande également de garder ce link handy, il liste beaucoup de choses à faire et à ne pas faire pour le Dispose Pattern.

(recopie de Stream.cs)

/// <summary>Releases the unmanaged resources used by the <see cref="T:System.IO.Stream" /> and optionally releases the managed resources.</summary> 
/// <param name="disposing"> 
/// <see langword="true" /> to release both managed and unmanaged resources; <see langword="false" /> to release only unmanaged resources.</param> 
[__DynamicallyInvokable] 
protected virtual void Dispose(bool disposing) 
{ 
}