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

175

Cuando necesita restablecer una transmisión al comienzo (por ejemplo MemoryStream), es mejor usar

stream.Seek(0, SeekOrigin.Begin);

o

stream.Position = 0;

He visto que ambos funcionan bien, pero me preguntaba si uno era más correcto que el otro.

Confundido
fuente
1
Si se trata de devolver el contenido del flujo de memoria, ToArray funciona independientemente de su posición
James Kyburz,
3
Respuesta: La más legible.
jgauffin
77
Personalmente prefiero stream.Position = 0;pero tengo que estar de acuerdo con @jgauffin, solo elija la más legible, ambas soluciones funcionan bien.
lenniep

Respuestas:

161

Use Posición cuando establezca una posición absoluta y Busque cuando establezca una posición relativa. Ambos se proporcionan por conveniencia para que pueda elegir uno que se ajuste al estilo y la legibilidad de su código. La posición de acceso requiere que la transmisión sea buscable para que sean intercambiables de forma segura.

gordy
fuente
55
Utilizo la propiedad incluso para posiciones relativas: me stream.Position += 10;parece bastante legible.
Jon Skeet
66
¿Hay una diferencia de velocidad entre usar SeekOrigin.Begin y SeekOrigin.Current?
gonzobrains
66
@gonzobrains "Valor de retorno: la nueva posición dentro de la secuencia, calculada combinando el punto de referencia inicial y el desplazamiento". . Por lo tanto, la combinación cuesta un poco más que simplemente establecer la posición directamente. Prácticamente no significa nada más que picar. )))
user808128
1
@ user808128 Citar la documentación, al menos ese tipo de documentación, no es evidencia de rendimiento. Debe consultar los códigos fuente para eso.
ArekBulski
8

Puede consultar el código fuente de ambos métodos para averiguarlo:

El costo es casi idéntico (3 si y algo de aritmética). Sin embargo, esto solo es cierto para saltar a compensaciones absolutas Position = 0y no a compensaciones relativas Position += 0, en cuyo caso Seek parece un poco mejor.

Sin embargo, debe tener en cuenta que estamos hablando sobre el rendimiento de un puñado de atirthmetics enteros y verificaciones ifs, es decir, que ni siquiera se puede medir con precisión con los métodos de evaluación comparativa. Como otros ya señalaron, no existe una diferencia significativa / detectable.

ArekBulski
fuente