Stream.Seek (0, SeekOrigin.Begin) 또는 Position = 0


175

스트림을 시작으로 재설정해야하는 경우 (예 :) MemoryStream사용하는 것이 가장 좋습니다.

stream.Seek(0, SeekOrigin.Begin);

또는

stream.Position = 0;

나는 둘 다 잘 작동하는 것을 보았지만 하나가 다른 것보다 더 정확한지 궁금해 했습니까?


1
이 메모리 스트림의 내용을 반환하는 경우, ToArray 위치에 관계없이 작동
제임스 Kyburz

3
답 : 가장 읽기 쉬운 것이 있습니다.
jgauffin 5

7
개인적으로 선호 stream.Position = 0;하지만 @jgauffin에 동의해야하며 가장 읽기 쉬운 것을 선택하면 두 솔루션 모두 제대로 작동합니다.
lenniep

답변:


161

절대 위치를 설정할 때는 위치를 사용하고 상대 위치를 설정할 때는 찾기를 사용하십시오. 둘 다 편의상 제공되므로 코드의 스타일과 가독성에 맞는 것을 선택할 수 있습니다. 위치에 액세스하려면 스트림을 검색 할 수 있어야 안전하게 교환 할 수 있습니다.


55
나는 상대 위치에도 속성을 사용합니다 stream.Position += 10;.
Jon Skeet

6
SeekOrigin.Begin과 SeekOrigin.Current를 사용하는 데 속도 차이가 있습니까?
gonzobrains

6
@gonzobrains "반환 값 : 초기 기준점과 오프셋을 결합하여 계산 된 스트림 내의 새로운 위치." . 따라서 결합은 위치를 직접 설정하는 것보다 약간 더 비쌉니다. 실제로 그것은 엄밀한 선택만을 의미합니다. )))
user808128

1
@ user808128 최소한 그러한 종류의 문서를 인용하는 것은 성능의 증거가 아닙니다. 이에 대한 소스 코드를 참조해야합니다.
ArekBulski

8

두 가지 방법에 대한 소스 코드를 보면 다음을 찾을 수 있습니다.

비용은 거의 동일합니다 (3 ifs 및 일부 산술). 그러나 이것은 같은 Position = 0상대 오프셋이 아닌 절대 오프셋으로 점프하는 경우에만 해당되며 Position += 0,이 경우 Seek가 약간 더 좋아 보입니다.

그러나 우리는 소수의 정수 산술 및 ifs 검사의 성능에 대해 이야기하고 있다는 것을 명심해야합니다. 이는 벤치마킹 방법으로는 정확하게 측정 할 수 없습니다. 다른 사람들이 이미 지적했듯이 유의미한 / 탐지 할 수있는 차이는 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.