2009-07-03 7 views
9

Avendo questo codice:Abbiamo bisogno di chiudere un C# BinaryWriter o BinaryReader in un blocco using?

using (BinaryWriter writer = new BinaryWriter(File.Open(ProjectPath, FileMode.Create))) 
{ 
    //save something here 
} 

abbiamo bisogno di chiudere il BinaryWriter? Se no, perché?

+0

Nonostante si tratti di un tipo diverso, questo è un duplicato di http://stackoverflow.com/questions/1070667/is-is-necessario-dispose-dbcommand-after-use/. Io voterei per chiudere, ma ho raggiunto il mio limite per il giorno. Suggerisco di non aver bisogno di una domanda "dovrei disporre di una classe che implementa IDisposable" per ogni classe che la implementa. Per favore considera di votare per chiudere come duplicato della tua domanda preferita IDisposable. –

+0

Che davvero pensi che questo sia un difetto di progettazione della documentazione/API: il compilatore dovrebbe avvisarti quando fai degli errori evidenti, e la documentazione dovrebbe indicare chiaramente quali chiamate di Close() sono equivalenti a Dispose (e, preferibilmente, non hanno tali chiamate Close() che sono completamente ridondanti in primo luogo). –

risposta

18

Fintanto che è tutto racchiuso in un blocco using, non è necessario chiamare esplicitamente Close.

Il blocco using farà in modo che l'oggetto è disposto, e le Close e Dispose metodi sono intercambiabili su BinaryWriter. (Il metodo Close chiama solo Dispose dietro le quinte.)

4

Con il codice che hai lì chiuderà il file una volta uscito dal blocco di utilizzo, quindi non è necessario chiamare close explcitly.

L'unica ragione per non utilizzare l'istruzione using potrebbe essere se si desidera che il file sia ancora aperto dopo aver terminato con il BinaryWriter, nel qual caso si dovrebbe conservare un riferimento di esso invece di passarlo nel costruttore come quello.

4

Inserendolo in una dichiarazione using come nell'esempio di codice, verrà chiamato Dispose, che chiude lo stream sottostante, quindi no. Si può vedere questo attraverso Riflettore:

protected virtual void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     this.OutStream.Close(); 
    } 
} 
0

Il blocco utilizzando automaticlly chiudere la scrittrice binario e metterlo in uno stato da GC'ed. L'uso dei blocchi è zucchero sintattico per eseguire personalmente la gestione e la chiusura delle eccezioni.

0

Inserendo il writer in un blocco using, la chiusura si verifica automaticamente quando lo scrittore viene eliminato. Quindi, in questo caso, non è necessario chiudere esplicitamente lo scrittore.

Problemi correlati