1

在调试代码的过程中,在我看来 DeFlateStream.read 重定向到 System.Net.ConnectStream.Read?当我检查 MSDN 源代码时,我很难找到这个重定向。任何人都可以帮我找出这是怎么发生的?谢谢!

4

1 回答 1

2

流不会“重定向” - 相反,DeflateStream.Read包装了源流的 Read 方法。

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

由于子类型化(和包含多态性)任何符合IO.Stream(并且是其子类型)的对象都可以作为源 Stream 提供。对于 DeflateStream 代码,这确保了被包装的 _stream 具有合适的 Read 方法。

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

有关更多详细信息,请参阅多态性(C# 编程指南).NET - CodeProject(运行时多态性部分)中的多态性。


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

    // ..
}
于 2014-06-22T04:00:40.173 回答