Questo è un vecchio, ma volevo fare qualcosa di simile oggi e ha scoperto che le cose sono cambiate. Poiché .net 4.5, v'è un argomento leaveOpen
:
public StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen)
L'unico problema è che non è del tutto evidente che valore impostare per gli altri parametri. Ecco qualche aiuto:
Da the msdn page per StreamReader Costruttore (Stream):
Questo costruttore inizializza la codifica UTF8Encoding, la proprietà BaseStream utilizzando il parametro flusso, e la dimensione interna buffer 1024 byte.
Questo lascia solo detectEncodingFromByteOrderMarks
che a giudicare da the source code è true
public StreamReader(Stream stream)
: this(stream, true) {
}
public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks)
: this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize) {
}
Sarebbe bello se alcuni di questi valori predefiniti sono stati esposti o se le argomentazioni erano opzionali in modo da poter specificare solo quelli quello che vogliamo
Oh bene, succede solo quando si chiama Dispose, non quando presumibilmente la finalizzazione. – Nefzen
@Nefzen: Questo perché non è garantito quale ordine i tuoi oggetti saranno finalizzati. Se sia StreamReader che il flusso sottostante sono idonei per la finalizzazione, il GC potrebbe prima finalizzare il flusso, quindi il lettore di stream non avrebbe un riferimento allo streaming. Per questo motivo, è possibile rilasciare solo risorse non gestite all'interno di un finalize (ad esempio, FileStream chiude l'handle del file di Windows nella sua finalizzazione). Oh, e, naturalmente, se non lo smaltisci mai, il flusso verrà comunque raccolto (e il file verrà chiuso). È solo una pessima pratica non distribuire un flusso. – JMarsch
Questo annidamento fa sì che l'analizzatore del codice VS si lamenti: 'CA2202: Microsoft.Usage: Object 'stream' può essere eliminato più volte nel metodo '...'. Per evitare di generare una eccezione System.ObjectDisposedException, non dovresti chiamare Dispose più di una volta su un oggetto. Deve essere semplicemente ignorato? Non ho avuto eccezioni fino ad ora ... –