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)
'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 –
Oui,' Close' appelle 'Dispose'. C'est une API bizarre. – Blorgbeard
@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