代码分析警告可能会两次处理对象

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();
}

它抱怨 trFile.OpenRead(filename)

Close just calls Dispose on the object,所以是的,您处理了该对象两次。 (并不是说处理一个对象两次是有问题的,只是多余的。)