Stream.Seek (0, SeekOrigin.Begin) или Position = 0


175

Когда вам нужно сбросить поток в начало (например MemoryStream), лучше всего использовать

stream.Seek(0, SeekOrigin.Begin);

или

stream.Position = 0;

Я видел, как оба работают хорошо, но задавался вопросом, был ли один более правильным, чем другой?


1
Если он должен вернуть содержимое потока памяти, ToArray работает независимо от позиции
Джеймс Кибурз

3
Ответ: самый читаемый.
jgauffin

7
Я лично предпочитаю, stream.Position = 0;но я должен согласиться с @jgauffin, просто выберите наиболее читаемый, оба решения работают нормально.
Леннип

Ответы:


161

Используйте Положение при настройке абсолютной позиции и Ищите при настройке относительной позиции. И то, и другое предусмотрено для удобства, поэтому вы можете выбрать тот, который соответствует стилю и удобочитаемости вашего кода. Доступ к Позиции требует, чтобы поток был доступен для поиска, поэтому они могут быть взаимозаменяемыми.


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

6
Есть ли разница в скорости между использованием SeekOrigin.Begin и SeekOrigin.Current?
гонзобрены

6
@gonzobrains "Возвращаемое значение: новая позиция в потоке, рассчитанная путем объединения начальной контрольной точки и смещения." , Таким образом, объединение стоит немного больше, чем просто установка позиции напрямую. Практически это ничего не значит, кроме придирки. )))
user808128

1
@ user808128 Цитирование документации, по крайней мере, такого рода документации, не является доказательством эффективности. Вы должны обратиться к исходным кодам для этого.
АрекБульски

8

Вы можете посмотреть исходный код обоих методов, чтобы узнать:

Стоимость почти одинакова (3 ifs и немного арифметики). Однако это справедливо только для перехода к абсолютным смещениям, Position = 0а не к относительным смещениям Position += 0, в этом случае Seek кажется немного лучше.

Однако вы должны иметь в виду, что мы говорим о выполнении нескольких целочисленных атертметик и проверок ifs, которые даже нельзя точно измерить с помощью методов бенчмаркинга. Как и другие уже отмеченные, нет никаких существенных / обнаружимых различий.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.