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


175

Quando è necessario reimpostare un flusso all'inizio (ad es. MemoryStream) È consigliabile utilizzarlo

stream.Seek(0, SeekOrigin.Begin);

o

stream.Position = 0;

Ho visto entrambi funzionare bene, ma mi chiedevo se uno fosse più corretto dell'altro?


1
Se serve per restituire il contenuto del flusso di memoria, ToArray funziona indipendentemente dalla posizione
James Kyburz,

3
Risposta: quella più leggibile.
jgauffin,

7
Personalmente preferisco, stream.Position = 0;ma devo essere d'accordo con @jgauffin, basta scegliere il più leggibile, entrambe le soluzioni funzionano bene.
lenniep,

Risposte:


161

Utilizzare Posizione quando si imposta una posizione assoluta e Cerca quando si imposta una posizione relativa. Entrambi sono forniti per comodità, così puoi sceglierne uno che si adatta allo stile e alla leggibilità del tuo codice. L'accesso alla posizione richiede che il flusso sia ricercabile, in modo che siano intercambiabili in modo sicuro.


55
Uso la proprietà anche per posizioni relative: mi stream.Position += 10;sembra abbastanza leggibile.
Jon Skeet,

6
C'è una differenza di velocità tra l'utilizzo di SeekOrigin.Begin e SeekOrigin.Current?
gonzobrains,

6
@gonzobrains "Valore di ritorno: la nuova posizione all'interno del flusso, calcolata combinando il punto di riferimento iniziale e l'offset." . Quindi la combinazione costa un po 'di più rispetto alla semplice impostazione della posizione direttamente. Praticamente non significa altro che nit-picking. )))
user808128

1
@ user808128 Citando la documentazione, questo tipo di documentazione non è una prova delle prestazioni. Dovresti fare riferimento ai codici sorgente per questo.
ArekBulski,

8

Puoi scoprire il codice sorgente per entrambi i metodi per scoprire:

Il costo è quasi identico (3 if e alcuni aritmetici). Tuttavia, questo è vero solo per saltare a offset assoluti come Position = 0e non offset relativi Position += 0, nel qual caso Seek sembra leggermente migliore.

Tuttavia, tieni presente che stiamo parlando delle prestazioni di una manciata di atirthmetics intere e di controlli ifs, che non è nemmeno misurabile con precisione con i metodi di benchmarking. Come altri hanno già sottolineato, non vi sono differenze significative / rilevabili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.