Stream.Seek (0, SeekOrigin.Begin) lub Position = 0

175

Jeśli chcesz zresetować strumień do początku (np. MemoryStream), Jest to najlepsza praktyka

stream.Seek(0, SeekOrigin.Begin);

lub

stream.Position = 0;

Widziałem, że oba działają dobrze, ale zastanawiałem się, czy jeden jest bardziej poprawny niż drugi?

Mylić
źródło
1
Jeśli ma zwrócić zawartość strumienia pamięci, ToArray działa niezależnie od pozycji
James Kyburz
3
Odpowiedź: Najbardziej czytelna.
jgauffin
7
Osobiście wolę, stream.Position = 0;ale zgadzam się z @jgauffin, po prostu wybieram najbardziej czytelny, oba rozwiązania działają dobrze.
lenniep

Odpowiedzi:

161

Użyj opcji Pozycja podczas ustawiania pozycji bezwzględnej i Szukaj podczas ustawiania pozycji względnej. Oba są zapewniane dla wygody, więc możesz wybrać taki, który pasuje do stylu i czytelności Twojego kodu. Dostęp do pozycji wymaga, aby strumień był możliwy do przeszukiwania, więc można je bezpiecznie wymieniać.

gordy
źródło
55
Używam tej właściwości nawet dla pozycji względnych: stream.Position += 10;wydaje mi się to całkiem czytelne.
Jon Skeet
6
Czy istnieje różnica szybkości między używaniem SeekOrigin.Begin i SeekOrigin.Current?
gonzobrains
6
@gonzobrains "Wartość zwracana : nowa pozycja w strumieniu, obliczona przez połączenie początkowego punktu odniesienia i przesunięcia." . Zatem łączenie kosztuje trochę więcej niż tylko bezpośrednie ustawienie pozycji. Praktycznie nie oznacza to nic poza zbieraniem nitek. )))
user808128
1
@ user808128 Cytując dokumentację, przynajmniej tego rodzaju dokumentację, nie świadczy o wydajności. Powinieneś odnieść się do kodów źródłowych.
ArekBulski
8

Możesz spojrzeć na kod źródłowy obu metod, aby dowiedzieć się:

Koszt jest prawie identyczny (3 jeśli i trochę arytmetyki). Jednak jest to prawdziwe tylko w przypadku przeskakiwania do przesunięć bezwzględnych, takich jak, Position = 0a nie do przesunięć względnych, takich jak Position += 0, w którym to przypadku Seek wydaje się nieco lepszy.

Należy jednak pamiętać, że mówimy o wydajności kilku liczb całkowitych i kontroli ifs, które nie są nawet dokładnie mierzalne metodami benchmarkingowymi. Jak inni już wskazali, nie ma znaczącej / wykrywalnej różnicy.

ArekBulski
źródło