在调试代码的过程中,我觉得DeFlateStream.read重定向到System.Net.ConnectStream.Read?当我检查MSDN源代码时,我无法轻易找到此重定向。任何人都可以帮我找到这种情况怎么样?谢谢!
答案 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);
}
// ..
}