C# DeFlateStream.read如何重定向到System.Net.ConnectStream.read?
在调试代码的过程中,我发现DeFlateStream.read重定向到System.Net.ConnectStream.read?当我检查MSDN源代码时,我无法轻松找到此重定向。有人能帮我找到这是怎么发生的吗?谢谢 流不是“重定向的”——而是DeflateStream.Read包装源流的Read方法 也就是说,封装DeflateStream被传递给源流(即在构造函数中),因此当调用Read时,它读取源流(至少在它能够产生有效输出的范围内),然后从它自己的Read1实现返回处理结果 由于,任何符合(并且是的子类型)的对象都可以作为源流提供。对于DeflateStream代码,这确保了包装的流具有合适的读取方法 提供给构造函数的实际流对象可以实现为FileStream、MemoryStream、ResourceStream、ConnectedStream等 有关更多详细信息,请参阅和(关于运行时多态性的部分)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实现返回处理结果 由于,任何符
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只需要提供“流”,只要传递的实际对象是一致的实现,它就可以工作。由于子类型多态性,“实际”读取方法将在运行时调用(因为读取方法是虚拟的)。我添加了一些链接。