2011-10-10 22 views

risposta

42

Non appena si esce dall'ambito di utilizzo del blocco, lo stream viene chiuso e smaltito. Close() chiama Flush(), quindi non è necessario chiamarlo manualmente.

+0

fine di utilizzare chiamate vicine? So solo che smaltisce lo stream e chiamo close methode alla fine ogni volta. –

+9

Non è necessario, Dispose chiuderà sempre lo stream e Close eseguirà prima il flush del flusso. – nos

+1

@FelixCzylwik: se la fine dell'utilizzo non stava chiamando Chiudi, avresti tonnellate di flussi aperti e aprire SQLConnections là fuori ...: D –

0

Varia, Stream per impostazione predefinita non chiama Flush() nel metodo Dispose con alcune eccezioni come FileStream. La ragione di ciò è che alcuni oggetti stream non hanno bisogno della chiamata a Flush poiché non usano un buffer. Alcuni, come MemoryStream, sovrascrivono esplicitamente il metodo per garantire che non venga intrapresa alcuna azione (rendendola un no-op).
Ciò significa che se preferisci non avere la chiamata extra, devi controllare se la sottoclasse Stream che stai utilizzando implementa la chiamata nel metodo Dispose e se è necessario o meno.

Indipendentemente da ciò, può essere una buona idea di chiamare lo stesso solo per migliorare la leggibilità - simile a come alcuni chiamano Close() alla fine delle loro dichiarazioni utilizzando:

using (FileStream fS = new FileStream(params)) 
using (CryptoStream cS = new CryptoStream(params)) 
using (BinaryWriter bW = new BinaryWriter(params)) 
{ 
    doStuff(); 
    //from here it's just readability/assurance that things are properly flushed. 
    bW.Flush(); 
    bW.Close(); 
    cS.Flush(); 
    cS.Close(); 
    fS.Flush(); 
    fS.Close(); 
} 
+1

Direi che l'aggiunta di flush e close call danneggia attivamente la leggibilità e la manutenibilità. L'istruzione using è ciò che garantisce che l'oggetto sia correttamente smaltito, anche nel caso in cui venga lanciata un'eccezione. – Palec

+0

@Palec Capisco che posizione, questo è un po 'uno standard divisorio tra molti sviluppatori da quello che ho visto. – TheHitchenator

+0

@Palec Inoltre, come indicato nella mia risposta - i flussi di default non chiamano 'Flush()' nei loro metodi di disposizione, il che significa che se si sta utilizzando un flusso non standard creato da qualcuno che non ha considerato che quindi il l'uso dell'istruzione non svuota correttamente il buffer. Per questo motivo, direi che è una buona pratica eseguire manualmente lo svuotamento - non farà nulla se non è necessario, ma se lo è allora assicurerà che i buffer vengano smaltiti correttamente. – TheHitchenator