Как DeFlateStream.read перенаправить на System.Net.ConnectStream.Read?

1

В процессе отладки кода и мне кажется, что DeFlateStream.read перенаправляет на System.Net.ConnectStream.Read? Когда я проверяю исходный код MSDN, я не мог легко найти это перенаправление. Кто-нибудь может помочь мне найти, как это происходит? благодарю!

Теги:
stream
gzipstream
deflatestream

1 ответ

2
Лучший ответ

Потоки не "перенаправляются" - вместо этого DeflateStream.Read обертывает метод чтения исходного потока.

То есть, обтекание DeflateStream передается исходному потоку (т.е. В конструкторе), так что, когда на него вызывается Read, он считывает исходный поток (по крайней мере, поскольку он может создавать допустимый вывод), а затем возвращает обработанный результат из он имеет реализацию Read 1.

Из-за подтипирования (и включения полиморфизма) любой объект, который соответствует (и является подтипом) IO.Stream, может быть предоставлен в качестве исходного потока. Что касается кода DeflateStream, это гарантирует, что wrapped _stream имеет подходящий метод Read.

Фактический объект потока, предоставленный конструктору, может быть реализован как FileStream, MemoryStream, ResourceStream, ConnectedStream и т.д.

Дополнительные сведения см. В разделе Полиморфизм (Руководство по программированию на С#) и Полиморфизм в.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);
    }

    // ..
}
  • 0
    Спасибо - но _stream определен как System.IO.Stream, а не System.Net.ConnectedStream, поэтому я до сих пор не совсем понимаю, как код попадает в ConnectedStream.read ...
  • 0
    Я вижу - поэтому в основном .NET здесь не навязывает ConnectionStream, а скорее код, который я читаю, создает объект deflateStream с использованием ConnectStream? Я думал, что DeflatStream.read всегда вызывает ConnectSteam.read, и это реализовано в .NET
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню