코드를 디버깅하는 과정에서 DeFlateStream.read가 System.Net.ConnectStream.Read로 리디렉션되는 것으로 보입니까? MSDN 소스 코드를 확인할 때이 리디렉션을 쉽게 찾을 수 없습니다. 누구든지 이것이 어떻게 발생하는지 찾을 수 있도록 도와 줄 수 있습니까? 감사!DeFlateStream.read는 System.Net.ConnectStream.Read로 어떻게 리디렉션됩니까?
1
A
답변
2
스트림이 "리디렉션"되지 않습니다. 대신 DeflateStream.Read 은 소스 스트림의 Read 메서드을 래핑합니다. 인
는 권취 DeflateStream 읽기가 그것에 호출 될 때, 그것은 (적어도 한, 그것은 유효 출력을 생산할 수있는 바와 같이) 소스 스트림을 판독하도록 상기 소스 스트림 (즉 생성자)에 전달되고 처리 된 결과를 자신의 Read 구현에서 반환합니다. 인해 Subtyping (and Inclusion Polymorphism)
에 따르는 (그리고 하위 유형) IO.Stream은 소스 스트림으로서 공급 될 수있는 개체. DeflateStream 코드와 관련하여 랩 된 _stream에 적절한 Read 메소드가 있는지 확인합니다.
생성자에 공급 실제 스트림 오브젝트Polymorphism (C# Programming Guide) 및 Polymorphism in .NET - CodeProject (런타임 다형성 섹션)에 대한 참조 등하여 FileStream, MemoryStream을하는 ResourceStream하는 ConnectedStream로서 구현 될 수
추가 세부 사항.
source found here에서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);
}
// ..
}
감사합니다 -하지만 _stream는 System.Net.ConnectedStream을 System.IO.Stream으로 정의되지 않으며, 그래서 코드가 ConnectedStream.read에 도착하는 방법은 아직 명확하지 않습니다. – user2210021
. 기본적으로 .NET은 ConnectionStream을 여기에 부과하지 않고, 읽고있는 코드는 ConnectStream을 사용하여 deflateStream 객체를 생성합니까? DeflatStream.read는 항상 ConnectSteam.read를 호출하고 .NET에 의해 구현되었습니다. – user2210021
@ user2210021 수정. .NET은 "스트림"만 제공하면되고, 전달 된 실제 객체가 일치하는 구현 인 한 계속 작동합니다. "실제"Read 메소드는 하위 유형 다형성 (Read 메소드가 가상 임)으로 인해 런타임에 호출됩니다. 일부 링크를 추가했습니다. 덕분에 – user2864740