2011-11-08 23 views
13

È vero che se utilizzo quanto segue, ci vorranno meno risorse e la pulizia sarà più veloce?utilizzando la parola chiave occupa meno spazio?

using (TextReader readLogs = File.OpenText("C:\\FlashAuto\\Temp\\log.txt")) 
{ 
     //my stuff 
} 

rispetto a:

TextReader readLogs = new StreamReader("C:\\FlashAuto\\Temp\\log.txt"); 
//my stuff 
readLogs.Close(); 
readLogs.Dispose(); 

risposta

25

La differenza tra tali esempi non è la prestazione, ma la sicurezza eccezione. using crea un blocco try...finally in background.

A utilizzando enunciato della forma:

using (ResourceType resource = expression) embedded-statement 

corrisponde alla espansione:

{ 
    ResourceType resource = expression; 
    try {  
    embedded-statement 
    } 
    finally { 
    // Dispose of resource 
    } 
} 

Per tipo di riferimento Lo smaltimento avviene attraverso:

finally { 
    if (resource != null) ((System.IDisposable)resource).Dispose(); 
} 

Da ECMA-344 del linguaggio C# Specifiche 4 ° Edizione


Inoltre non c'è bisogno di chiamare sia Close e Dispose. Quelle funzioni sono equivalenti.

+0

In realtà sto facendo alcuni elementi di registrazione dopo ogni 10 secondi nel thread dell'interfaccia utente. Ogni volta che legge il log e viene visualizzato in una casella di testo multilinea, viene presa una grande quantità di memoria. Ma se aggiorno la casella di testo senza leggere il file utilizzando un messaggio di stato del mio, non c'è alcun cambiamento nella memoria. – Rohan

+0

@musefan la formattazione delle quote è stata deliberata, poiché si tratta di citazioni dalle specifiche. – CodesInChaos

+0

Abbastanza corretto, probabilmente dovresti aggiungere dei riferimenti al momento della pubblicazione la prossima volta, però, evita la confusione per i lettori innocenti;) – musefan

7

Il primo campione è di breve portata di mano per:

TextReader readLogs = File.OpenText("C:\\FlashAuto\\Temp\\log.txt"); 
try 
{ 
    // My stuff 
} 
finally 
{ 
    if (readLogs != null) 
    { 
     ((IDisposable)readLogs).Dispose(); 
    } 
} 

La sua non è che il suo più veloce, la sua che readLogs verrà pulito, anche se un'eccezione occurrs che non accadrà nel secondo esempio.

Vedere using Statement (C# Reference) per ulteriori informazioni.

Non c'è bisogno di chiamare sia Close e Dispose, internamente il metodo Close fa lo stesso lavoro come metodo Dispose (il suo solo rinominato perché gli sviluppatori sono abituati ad avere un metodo chiamato Close).


Aggiornamento: Non v'è alcuna differenza tra chiamare File.OpenText e new StreamReader - internamente File.OpenText solo crea e restituisce una nuova istanza di StreamReader.

+0

In realtà sto facendo alcuni elementi di registrazione ogni 10 secondi nel thread dell'interfaccia utente. Ogni volta che legge il log e viene visualizzato in una casella di testo multilinea, viene presa una grande quantità di memoria.Ma se aggiorno la casella di testo senza leggere il file utilizzando un messaggio di stato del mio, non c'è alcun cambiamento nella memoria. – Rohan

+1

@Rohan Sembra che la differenza sia nel bit '// My stuff' - se stai leggendo l'intero file ogni volta, questo probabilmente userà un blocco di memoria. – Justin

+0

'File.OpenText' dovrebbe trovarsi al di fuori del blocco' try ... finally'. Il tuo codice non verrebbe compilato perché 'readLogs' non è garantito per essere inizializzato nella clausola finally. – CodesInChaos

Problemi correlati