Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理包含流的派生流_C#_Stream_Dispose_Idisposable - Fatal编程技术网

C# 处理包含流的派生流

C# 处理包含流的派生流,c#,stream,dispose,idisposable,C#,Stream,Dispose,Idisposable,我从stream派生了以下类: public class EncryptedStream : Stream { private readonly SymmetricAlgorithm _engine; private readonly CryptoStream _cryptoStream; private readonly Stream _inputStream; //Standard overrides of stream } 我正在寻找一种方法来处理基流以及

我从stream派生了以下类:

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

   //Standard overrides of stream
}
我正在寻找一种方法来处理基流以及这个类中的所有流和资源。我已经读了一些关于dispose模式的内容,由于stream已经实现了IDisposable,我的想法是在这个类中进行dispose,我将执行以下操作:

protected override void Dispose(bool disposing)        
{
    if (disposing)
    {
       _engine.Dispose();
       _cryptoStream.Dispose();
       _inputStream.Dispose();
    }
}
这应该在处理基流时调用,因为基流IDisposable调用Close(),后者调用Dispose(true)

这似乎是可行的,这种方法有什么缺点吗?还有,我是否需要在If语句之后调用base.Dispose(disposing)?我不这么认为,因为在基本流上调用Dispose基本上已经完成了,对吗


我花了一段时间才明白,还有没有其他不那么复杂的方法来处理这个问题。

你所拥有的一切都是好的。无需调用
流::Dispose(bool)
,它是一个具有空主体的虚拟方法

我也建议你保留这个,它列出了很多你应该做和不应该做的事情

(从Stream.cs复制)

///释放所使用的非托管资源,并可以选择释放托管资源。
/// 
///释放托管和非托管资源;仅释放非托管资源。
[[uuuu动态调用可禁用]
受保护的虚拟void Dispose(bool disposing)
{
}
/// <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)
{
}