如何正确处理对象?为什么Code Analysis会不断改变主意?

时间:2011-07-31 08:20:02

标签: c# dispose

我昨天加入了一个项目,我们决定将两个项目合并为一个,并结合两者的特点(它们基本上吸收了我们)。

问题是,他们在某处有内存泄漏,他们责成我找到并杀死它。

我在Visual Studio中运行了一个代码分析,并提出了一长串警告,其中大部分都是我们可以忽略的,我正在尝试解决的是对象处理问题。我从来没有真正特别关注的东西,我很惊讶地发现,通过代码分析来确定某些东西是正确的并不容易。

代码以此开头:

StreamWriter SW = new StreamWriter(File.Create("folder/file.txt"));
SW.WriteLine("text");
SW.WriteLine("text");
SW.WriteLine("text");
SW.WriteLine();
SW.WriteLine("text");
SW.WriteLine("text");
SW.WriteLine("text");
SW.Close();
SW.Flush();

但Code Analysis表示File.Create没有沿着所有代码路径处理掉,并且SW可以被丢弃一次以上,我去寻找并发现你不应该同时使用Close和Flush,事实上,你应该使用using语句,所以我改为:

using(StreamWriter SW = new StreamWriter(File.Create("folder/file.txt")))
{
    SW.WriteLine("text");
    SW.WriteLine("text");
    SW.WriteLine("text");
    SW.WriteLine();
    SW.WriteLine("text");
    SW.WriteLine("text");
    SW.WriteLine("text");
}

正在处理的SW消失了,但它仍然说File.Create没有沿着所有代码路径被处理掉,只有一个代码路径,所以它没有意义,我尝试添加一个单独的使用File.Create的语句,以及单独创建/编写文件,但代码分析仍然可以捕获它。

这似乎很容易弄明白,除非VS有误报或其他什么。

无论如何,感谢您给我时间阅读本文。

〜EDIT

我在原始帖子中撒谎,当我添加double using语句时,包括当我使用“Stream”时,它告诉我对象可以被处理多次,导致objectdisposedexception。我认为这将是一些奇怪的怪异事件。因为我自己从未处理过它。

当前代码:

using (Stream stream = File.Create("folder/file.txt"))
{
    using (StreamWriter SW = new StreamWriter(stream))
    {
        SW.WriteLine("");
        SW.WriteLine("");
        SW.WriteLine("");
        SW.WriteLine();
        SW.WriteLine("");
        SW.WriteLine("");
        SW.WriteLine("");
    }
}

这个工作和VS通过它,非常感谢。

using (StreamWriter SW = File.CreateText("text/awardsList.txt"))
{
    SW.WriteLine("");
    SW.WriteLine("");
    SW.WriteLine("");
    SW.WriteLine();
}

1 个答案:

答案 0 :(得分:4)

我怀疑它正在寻找这样的东西:

using (Stream stream = File.Create("folder/file.txt"))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        ...
    }
}

假设File.Create成功,那么StreamWriter构造函数也是如此,这可能是合理的 - 但是VS可能不知道这一点。它也可能不知道处理流的写入处理。

我个人虽然使用了File.CreateText,但这样可以避免这个问题并且更简单:)

using (TextWriter writer = File.CreateText("folder/file.txt"))
{
    ...
}