Stream.Seek (0, SeekOrigin.Begin) atau Posisi = 0

175

Ketika Anda perlu mengatur ulang aliran ke awal (misalnya MemoryStream) apakah itu praktik terbaik untuk digunakan

stream.Seek(0, SeekOrigin.Begin);

atau

stream.Position = 0;

Saya pernah melihat keduanya bekerja dengan baik, tetapi bertanya-tanya apakah yang satu lebih benar daripada yang lain?

ConfusedNoob
sumber
1
Jika ingin mengembalikan isi dari aliran memori, ToArray berfungsi terlepas dari posisi
James Kyburz
3
Jawab: Yang paling mudah dibaca.
jgauffin
7
Saya pribadi lebih suka stream.Position = 0;tetapi saya harus setuju dengan @ jgauffin, cukup pilih yang paling mudah dibaca, kedua solusi bekerja dengan baik.
lenniep

Jawaban:

161

Gunakan Posisi saat mengatur posisi absolut dan Cari saat mengatur posisi relatif. Keduanya disediakan untuk kenyamanan sehingga Anda dapat memilih satu yang sesuai dengan gaya dan keterbacaan kode Anda. Mengakses Posisi membutuhkan aliran yang dapat dicari sehingga mereka dapat dipertukarkan dengan aman.

bagus
sumber
55
Saya menggunakan properti bahkan untuk posisi relatif: stream.Position += 10;tampaknya cukup mudah dibaca oleh saya.
Jon Skeet
6
Apakah ada perbedaan kecepatan antara menggunakan SeekOrigin.Begin dan SeekOrigin.Current?
gonzobrains
6
@gonzobrains "Nilai Pengembalian: Posisi baru di dalam aliran, dihitung dengan menggabungkan titik referensi awal dan offset." . Jadi biaya penggabungan sedikit lebih dari sekadar mengatur posisi secara langsung. Praktis itu tidak berarti apa-apa selain memetik. )))
user808128
1
@ user808128 Mengutip dokumentasi, setidaknya dokumentasi semacam itu, bukan bukti kinerja. Anda harus merujuk ke kode sumber untuk itu.
ArekBulski
8

Anda dapat melihat kode sumber untuk kedua metode untuk mencari tahu:

Biaya hampir identik (3 jika dan beberapa aritmatika). Namun ini hanya berlaku untuk melompat ke offset absolut suka Position = 0dan bukan offset relatif seperti Position += 0, dalam hal ini Seek tampak sedikit lebih baik.

Namun Anda harus ingat bahwa kita berbicara tentang kinerja beberapa atithmetics integer dan pemeriksaan ifs, itu seperti bahkan tidak dapat diukur secara akurat dengan metode benchmarking. Seperti yang sudah disebutkan sebelumnya, tidak ada perbedaan signifikan / terdeteksi.

ArekBulski
sumber