2017-10-20 5 views
0

ストリームI持っているストリームから派生し、次のクラス:私はベースを配置ストリームと、このクラス内のすべてのストリームやリソースへの道を探しています

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

    //Standard overrides of stream 
} 

。私は、私の考えは、私は次のことを行うと、このクラスで処分することになり、処分パターンについて少し読んで、ストリームは既にIDisposableインターを実装しています

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

ので、基本ストリームを廃棄するときには、呼び出される必要がありますベースストリームIDisposableは、Dispose(true)を呼び出すClose()を呼び出します。

これは動作するようですが、このアプローチには欠点がありますか?また、if文の後にbase.Dispose(disposing)を呼び出す必要がありますか?私はそれが本質的に既に最初の場所でベースストリームでDisposeを呼び出すことによって行われているので、そうは思わない?

これは私が理解するのに少し時間がかかったので、この処分について行くために他のあまり複雑でない方法がありますか?

答えて

1

あなたが持っているものは良いです。 Stream::Dispose(bool)に電話する必要はなく、空のボディを持つ仮想メソッドです。

link handyのままにしておくことをお勧めします。Dispose PatternにはたくさんのDosとしません。 (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) 
{ 
}