2017-10-06 6 views
0

juste couru une analyse de code sur l'une des applications dont j'ai hérité, et il a soulevé des avertissements sur un code similaire à ce qui suit:analyse du code met en garde contre un potentiel de disposer d'un objet à deux reprises

using (StreamWriter tw = File.AppendText("Log.txt")) 
{ 
    try 
    { 
     tw.WriteLine(DateTime.Now.ToString("------------------------"); 
     tw.WriteLine(data); 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine(String.Format(CultureInfo.InvariantCulture, "Error writing to the log file: {0}", ex.Message)); 
    } 
    finally 
    { 
     tw.Close(); 
    } 
} 

Si je en commentaire le bloc finally, l'avertissement n'est pas déclenché. J'étais sous l'impression que la fermeture d'un écrivain de flux fermait seulement le fichier sous-jacent, mais ne disposait pas réellement de l'objet écrivain. Est-ce que l'analyse de code est cassée, ou est-ce que je ne comprends pas comment le rédacteur de flux devrait être utilisé?

Voici un autre exemple où l'analyse de code se plaint possible Mise au rebut à la fois écrivain et le flux sous-jacent deux fois:

using (TextReader tr = new StreamReader(File.OpenRead(filename))) 
{ 
    while (tr.ReadLine() != null) 
    { 
     counter++; 
    } 

    tr.Close(); 
} 

Il se plaint à la fois tr et File.OpenRead(filename)

+0

'using' dispose automatiquement l'instance créée, vous n'avez pas besoin d'appeler explicitement' .Close() 'ou' .Dispose() '. Je suggère googling, comment 'using' fonctionne –

+0

Oui,' Close' appelle 'Dispose'. C'est une API bizarre. – Blorgbeard

+3

@o_O L'auteur de la question a déclaré qu'il pensait que «Fermer» était différent de la mise au rebut, pas qu'un «utiliser» ne dispose pas de l'objet. – Servy

Répondre

2

Close just calls Dispose on the object, donc oui, vous disposer de l'objet deux fois. (Le fait de disposer d'un objet deux fois est problématique, juste redondant.)

+0

Oui, j'ai raté cette partie. Cohérence, Microsoft? D'abord, ils veulent que nous enveloppions 'IDisposable' dans' using ', puis ceci. – ajeh