在调试代码的过程中,在我看来 DeFlateStream.read 重定向到 System.Net.ConnectStream.Read?当我检查 MSDN 源代码时,我很难找到这个重定向。任何人都可以帮我找出这是怎么发生的?谢谢!
问问题
106 次
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 回答