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

时间:2014-06-22 03:48:26

标签: c# stream gzipstream deflatestream

在调试代码的过程中,我觉得DeFlateStream.read重定向到System.Net.ConnectStream.Read?当我检查MSDN源代码时,我无法轻易找到此重定向。任何人都可以帮我找到这种情况怎么样?谢谢!

1 个答案:

答案 0 :(得分:2)

Streams没有被重定向" - 相反,DeflateStream.Read 包装源流的Read方法。

也就是说,包装DeflateStream是通过 source Stream(即在构造函数中)传递的,因此当调用Read时,它会读取源流(至少在它可以产生的范围内)有效输出)然后从它自己的Read 1 实现返回处理结果。

由于Subtyping (and Inclusion Polymorphism)任何符合IO.Stream的对象都可以作为源Stream提供。关于DeflateStream代码,这可以确保包装的_stream具有合适的Read方法。

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

有关其他详细信息,请参阅Polymorphism (C# Programming Guide)Polymorphism in .NET - CodeProject(有关运行时多态性的部分)。


1 source found here可以看出它相当于:

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);
    }

    // ..
}