C# DeFlateStream.read如何重定向到System.Net.ConnectStream.read?

C# DeFlateStream.read如何重定向到System.Net.ConnectStream.read?,c#,stream,gzipstream,deflatestream,C#,Stream,Gzipstream,Deflatestream,在调试代码的过程中,我发现DeFlateStream.read重定向到System.Net.ConnectStream.read?当我检查MSDN源代码时,我无法轻松找到此重定向。有人能帮我找到这是怎么发生的吗?谢谢 流不是“重定向的”——而是DeflateStream.Read包装源流的Read方法 也就是说,封装DeflateStream被传递给源流(即在构造函数中),因此当调用Read时,它读取源流(至少在它能够产生有效输出的范围内),然后从它自己的Read1实现返回处理结果 由于,任何符

在调试代码的过程中,我发现DeFlateStream.read重定向到System.Net.ConnectStream.read?当我检查MSDN源代码时,我无法轻松找到此重定向。有人能帮我找到这是怎么发生的吗?谢谢

流不是“重定向的”——而是DeflateStream.Read包装源流的Read方法

也就是说,封装DeflateStream被传递给源流(即在构造函数中),因此当调用Read时,它读取源流(至少在它能够产生有效输出的范围内),然后从它自己的Read1实现返回处理结果

由于,任何符合(并且是的子类型)的对象都可以作为源流提供。对于DeflateStream代码,这确保了包装的流具有合适的读取方法

提供给构造函数的实际流对象可以实现为FileStream、MemoryStream、ResourceStream、ConnectedStream等

有关更多详细信息,请参阅和(关于运行时多态性的部分)


1从表中可以看出,它相当于:

public override int Read(byte[] array, int offset, int count) {
    // Setup state

    while(true) {
        // Process buffer into result until..
        bytesRead = inflater.Inflate(array, currentOffset, remainingCount);
        if(remainingCount == 0) {
          // ..read enough, break
        }
        if (inflater.Finished()) {
          // ..or end of source stream, break
        }
        // Making sure to read more from the source stream as required
        // (_stream is a Stream, assigned in the constructor)
        int bytes = _stream.Read( buffer, 0, buffer.Length);
        inflater.SetInput(buffer, 0 , bytes);
    }

    // ..
}

谢谢-但是_流被定义为System.IO.stream,而不是System.Net.ConnectedStream,所以我仍然不太清楚代码是如何到达ConnectedStream.read的…我明白了-所以基本上.Net在这里不强制使用ConnectionStream,而是我正在阅读的代码使用ConnectStream构造deflateststream对象?我认为DeflatStream.read总是调用ConnectSteam.read,这是由实现的。NET@user2210021对的NET只需要提供“流”,只要传递的实际对象是一致的实现,它就可以工作。由于子类型多态性,“实际”读取方法将在运行时调用(因为读取方法是虚拟的)。我添加了一些链接。