Потоки зачем использовать Seek(0L, SeekOrigin.Begin) вместо Position = 0 или наоборот

#c# #asp.net

#c# #asp.net

Вопрос:

Не мог бы кто-нибудь, пожалуйста, объяснить мне различия, если таковые имеются?

Я попытался погуглить, но не смог найти много информации. Возможно, я не использовал правильные ключевые слова.

Любая информация была бы высоко оценена.

Ответ №1:

stream.Seek(x, SeekOrigin.Begin); и stream.Position = x; оба результата приводят к тому, что позиция потока устанавливается равной x . Разница в том, что Position установщик безоговорочно отбрасывает любой буфер чтения, в то время как Seek метод пытается сохранить ту часть буфера, которая все еще актуальна для новой позиции.

Вам придется протестировать, какой из них быстрее для вашего сценария, но определенно есть разница в производительности, и ни один из них не быстрее во всех случаях. Мне действительно интересно, почему это различие не задокументировано.

Комментарии:

1. Спасибо, это было важное отличие, о котором я не знал. Помогло мне исправить ошибку, при которой небольшие обратные запросы приводили к неправильным данным. Вместо этого изменено на Position, и данные были прочитаны.

Ответ №2:

В вашем примере нет разницы.

Фактическое различие между Stream.Position и Stream.Seek заключается в том, что Position используется абсолютное смещение, тогда как Seek используется смещение относительно начала координат, указанного вторым аргументом.

Ответ №3:

Насколько я могу судить, по крайней мере, для этого конкретного случая, ничего.

Для обоих методов Seek() и свойства Position требуется, чтобы CanSeek был true, поэтому, насколько я вижу, это зависит от разработчика.

Seek действительно существует для того, чтобы разрешить поиск из указанных местоположений (SeekOrigins) в смещение (примеры, приведенные в MSDN, несколько запутанны, но отражают цель:http://msdn.microsoft.com/en-us/library/system.io.filestream.seek.aspx ).

Позиция является абсолютной и, очевидно, не предназначена для поиска.

Упомянутый вами случай просто оказывается эквивалентным.

Лично я бы использовал .Position = 0 для перехода к началу потока, поскольку для меня это звучит чище, чем «Искать, используя начало файла в качестве источника и переместите это смещение на 0 байт».