Как DeFlateStream.read перенаправить на System.Net.ConnectStream.Read?
В процессе отладки кода и мне кажется, что DeFlateStream.read перенаправляет в System.Net.ConnectStream.Read? Когда я проверял исходный код MSDN, я не мог легко найти это перенаправление. Кто-нибудь может помочь мне найти, как это происходит? Спасибо!
1 ответ
Потоки не "перенаправляются" - вместо этого DeflateStream.Read оборачивает метод Read исходного потока.
То есть упаковка DeflateStream передается исходному потоку (т. Е. В конструкторе), поэтому, когда для него вызывается метод чтения, он читает исходный поток (по крайней мере, поскольку он может выдавать действительный вывод) и затем возвращает обработанный результат из это собственная реализация Read1.
Из-за подтипа (и Полиморфизма Включения)любой объект, который соответствует (и является подтипом) IO.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);
}
// ..
}