2017-10-20 21 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) 
{ 
}