Stream.Seek (0, SeekOrigin.Begin) ou Position = 0

175

Quando você precisa redefinir um fluxo para o início (por exemplo MemoryStream), é uma prática recomendada usar

stream.Seek(0, SeekOrigin.Begin);

ou

stream.Position = 0;

Eu vi os dois funcionar bem, mas me perguntei se um estava mais correto que o outro?

ConfusedNoob
fonte
1
Se é para retornar o conteúdo do fluxo de memória, ToArray funciona independentemente da posição
James Kyburz
3
Resposta: A mais legível.
precisa saber é o seguinte
7
Pessoalmente, prefiro, stream.Position = 0;mas tenho que concordar com @jgauffin, basta escolher o mais legível, ambas as soluções funcionam bem.
Lenniep

Respostas:

161

Use Posição ao definir uma posição absoluta e Buscar ao definir uma posição relativa. Ambos são fornecidos por conveniência, para que você possa escolher um que se adapte ao estilo e à legibilidade do seu código. A Posição de acesso exige que o fluxo seja procurável para que eles sejam intercambiáveis ​​com segurança.

gordy
fonte
55
Eu uso a propriedade mesmo para posições relativas: stream.Position += 10;parece-me bastante legível.
Jon Skeet
6
Existe uma diferença de velocidade entre o uso de SeekOrigin.Begin e SeekOrigin.Current?
precisa saber é o seguinte
6
@gonzobrains "Valor de retorno: a nova posição dentro do fluxo, calculada combinando o ponto de referência inicial e o deslocamento". . Portanto, a combinação custa um pouco mais do que apenas definir a posição diretamente. Praticamente, isso não significa nada, a não ser escolha. )))
user808128
1
@ user808128 A documentação de cotação, pelo menos, é desse tipo de documentação, não é evidência de desempenho. Você deve consultar os códigos-fonte para isso.
ArekBulski
8

Você pode procurar no código fonte os dois métodos para descobrir:

O custo é quase idêntico (3 ifs e algumas aritméticas). No entanto, isso só é válido para saltar para compensações absolutas como Position = 0e não para compensações relativas Position += 0, e nesse caso a Busca parece um pouco melhor.

No entanto, você deve ter em mente que estamos falando sobre o desempenho de um punhado de atinméticos inteiros e verificações ifs, isso nem sequer é mensurável com precisão com métodos de benchmarking. Como outros já apontados, não há diferença significativa / detectável.

ArekBulski
fonte