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?


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ć.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.