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

175

Wenn Sie einen Stream auf den Anfang zurücksetzen müssen (z. B. MemoryStream), empfiehlt es sich, ihn zu verwenden

stream.Seek(0, SeekOrigin.Begin);

oder

stream.Position = 0;

Ich habe gesehen, dass beide gut funktionieren, habe mich aber gefragt, ob einer korrekter ist als der andere?

ConfusedNoob
quelle
1
Wenn der Inhalt des Speicherstroms zurückgegeben werden soll, funktioniert ToArray unabhängig von der Position
James Kyburz
3
Antwort: Derjenige, der am besten lesbar ist.
Jgauffin
7
Ich persönlich bevorzuge, stream.Position = 0;aber ich muss @jgauffin zustimmen, wählen Sie einfach die am besten lesbare, beide Lösungen funktionieren gut.
Lenniep

Antworten:

161

Verwenden Sie Position, wenn Sie eine absolute Position festlegen, und Suchen Sie, wenn Sie eine relative Position festlegen. Beide werden zur Vereinfachung bereitgestellt, sodass Sie eine auswählen können, die dem Stil und der Lesbarkeit Ihres Codes entspricht. Für den Zugriff auf Position muss der Stream durchsuchbar sein, damit er sicher austauschbar ist.

gordy
quelle
55
Ich benutze die Eigenschaft auch für relative Positionen: stream.Position += 10;scheint mir ziemlich lesbar.
Jon Skeet
6
Gibt es einen Geschwindigkeitsunterschied zwischen der Verwendung von SeekOrigin.Begin und SeekOrigin.Current?
Gonzobrains
6
@gonzobrains "Rückgabewert: Die neue Position innerhalb des Streams, berechnet durch Kombinieren des anfänglichen Referenzpunkts und des Versatzes." . Das Kombinieren kostet also etwas mehr als nur das direkte Einstellen der Position. Praktisch bedeutet es nichts als Nitsammeln. )))
user808128
1
@ user808128 Das Zitieren von Dokumentation, zumindest dieser Art von Dokumentation, ist kein Leistungsnachweis. Sie sollten sich dazu auf Quellcodes beziehen.
ArekBulski
8

Sie können sich den Quellcode für beide Methoden ansehen, um Folgendes herauszufinden:

Die Kosten sind nahezu identisch (3 ifs und einige Arithmetik). Dies gilt jedoch nur für das Springen zu absoluten Offsets wie Position = 0und nicht zu relativen Offsets wie Position += 0. In diesem Fall scheint Seek etwas besser zu sein.

Sie sollten jedoch bedenken, dass es sich um die Leistung einer Handvoll ganzzahliger Atirthmetiken und Ifs-Checks handelt, die mit Benchmarking-Methoden nicht einmal genau messbar sind. Wie andere bereits betont haben, gibt es keinen signifikanten / nachweisbaren Unterschied.

ArekBulski
quelle