代码分析警告可能会两次处理对象
Code analysis warns about a potential of disposing of an object twice
只是 运行 对我继承的其中一个应用程序的代码分析,它引发了关于类似于以下代码的警告:
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();
}
}
如果我注释掉 finally
块,则不会引发警告。我的印象是关闭流编写器只关闭了底层文件,但实际上并没有处理编写器对象。是代码分析出了问题,还是我误解了应该如何使用 Stream Writer?
这是另一个代码分析抱怨可能两次处理编写器和底层流的示例:
using (TextReader tr = new StreamReader(File.OpenRead(filename)))
{
while (tr.ReadLine() != null)
{
counter++;
}
tr.Close();
}
它抱怨 tr
和 File.OpenRead(filename)
Close just calls Dispose on the object,所以是的,您处理了该对象两次。 (并不是说处理一个对象两次是有问题的,只是多余的。)
只是 运行 对我继承的其中一个应用程序的代码分析,它引发了关于类似于以下代码的警告:
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();
}
}
如果我注释掉 finally
块,则不会引发警告。我的印象是关闭流编写器只关闭了底层文件,但实际上并没有处理编写器对象。是代码分析出了问题,还是我误解了应该如何使用 Stream Writer?
这是另一个代码分析抱怨可能两次处理编写器和底层流的示例:
using (TextReader tr = new StreamReader(File.OpenRead(filename)))
{
while (tr.ReadLine() != null)
{
counter++;
}
tr.Close();
}
它抱怨 tr
和 File.OpenRead(filename)
Close just calls Dispose on the object,所以是的,您处理了该对象两次。 (并不是说处理一个对象两次是有问题的,只是多余的。)