1

コードのデバッグ中に、DeFlateStream.read が System.Net.ConnectStream.Read にリダイレクトされているように見えますか? MSDN ソース コードを確認すると、このリダイレクトを簡単に見つけることができませんでした。誰でもこれがどのように発生するかを見つけるのを手伝ってくれますか? ありがとう!

4

1 に答える 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 に答える