Потік.Погляньте (0, SeekOrigin.Begin) або Позиція = 0


175

Коли вам потрібно скинути потік до початку (наприклад MemoryStream), це найкраща практика використання

stream.Seek(0, SeekOrigin.Begin);

або

stream.Position = 0;

Я бачив, як вони чудово працюють, але цікавились, чи одна правильніша за іншу?


1
Якщо потрібно повернути вміст потоку пам'яті, ToArray працює незалежно від позиції
James Kyburz

3
Відповідь: Той, який найбільше читається.
jgauffin

7
Я особисто вважаю за краще, stream.Position = 0;але я маю згоду з @jgauffin, просто виберіть найбільш читабельне, обидва рішення працюють чудово.
lenniep

Відповіді:


161

Використовуйте Позицію при встановленні абсолютного положення та Шукайте під час встановлення відносної позиції. Обидва передбачені для зручності, так що ви можете вибрати той, який відповідає стилю та читабельності вашого коду. Доступ до позиції вимагає пошуку потоку, щоб вони були безпечно взаємозамінні.


55
Я використовую властивість навіть для відносних позицій: stream.Position += 10;здається мені досить читабельним.
Джон Скіт

6
Чи є різниця швидкостей між використанням SeekOrigin.Begin та SeekOrigin.Current?
gonzobrains

6
@gonzobrains "Повернене значення: нове положення всередині потоку, обчислене поєднанням початкової опорної точки та зміщення". . Тож комбінування коштує трохи більше, ніж просто встановлення позиції безпосередньо. Практично це не означає нічого, як збирання азоту. )))
користувач808128

1
@ user808128 Цитування документації, якнайменше, ця документація не є свідченням ефективності. Для цього слід посилатися на вихідні коди.
АрекБульський

8

Ви можете подивитися вихідний код для обох методів, щоб дізнатися:

Вартість майже однакова (3 ifs та деякі арифметики). Однак це справедливо лише для стрибків до абсолютних компенсацій, як, Position = 0а не відносних, як Position += 0, наприклад , Seek здається трохи кращим.

Однак ви повинні мати на увазі, що ми говоримо про виконання декількох цілих атірметиків і перевірок ifs, що не подобається навіть точно виміряти методами бенчмаркінгу. Як і інші, які вже вказувались, суттєвої / помітної різниці немає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.