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

175

Lorsque vous devez réinitialiser un flux au début (par exemple MemoryStream), est-il recommandé d'utiliser

stream.Seek(0, SeekOrigin.Begin);

ou

stream.Position = 0;

J'ai vu les deux fonctionner correctement, mais je me suis demandé si l'un était plus correct que l'autre?

ConfusNoob
la source
1
S'il s'agit de renvoyer le contenu du flux mémoire, ToArray fonctionne quelle que soit la position
James Kyburz
3
Réponse: celui qui est le plus lisible.
jgauffin
7
stream.Position = 0;Personnellement, je préfère mais je suis d'accord avec @jgauffin, choisissez simplement la plus lisible, les deux solutions fonctionnent bien.
lenniep

Réponses:

161

Utilisez Position lors de la définition d'une position absolue et Recherche lors de la définition d'une position relative. Les deux sont fournis pour des raisons de commodité afin que vous puissiez en choisir un qui correspond au style et à la lisibilité de votre code. Pour accéder à la position, le flux doit être recherché afin qu'ils soient interchangeables en toute sécurité.

Gordy
la source
55
J'utilise la propriété même pour des positions relatives: stream.Position += 10;me semble assez lisible.
Jon Skeet
6
Y a-t-il une différence de vitesse entre l'utilisation de SeekOrigin.Begin et SeekOrigin.Current?
gonzobrains
6
@gonzobrains "Valeur de retour: La nouvelle position dans le flux, calculée en combinant le point de référence initial et le décalage." . La combinaison coûte donc un peu plus que la simple définition directe de la position. Pratiquement, cela ne signifie rien d'autre que du pinaillage. )))
user808128
1
@ user808128 Citer de la documentation, du moins ce genre de documentation, n'est pas une preuve de performance. Vous devriez vous référer aux codes sources pour cela.
ArekBulski
8

Vous pouvez consulter le code source des deux méthodes pour le découvrir:

Le coût est presque identique (3 ifs et quelques arithmétiques). Cependant, cela n'est vrai que pour passer à des décalages absolus comme Position = 0et non à des décalages relatifs comme Position += 0, auquel cas Seek semble légèrement meilleur.

Cependant, vous devez garder à l'esprit que nous parlons de la performance d'une poignée de produits cosmétiques entiers et de vérifications ifs, qui ne sont même pas mesurables avec précision avec des méthodes d'analyse comparative. Comme d'autres l'ont déjà souligné, il n'y a pas de différence significative / détectable.

ArekBulski
la source