我昨天加入了一个项目,我们决定将两个项目合并为一个,并结合两者的特点(它们基本上吸收了我们)。
问题是,他们在某处有内存泄漏,他们责成我找到并杀死它。
我在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();
}
答案 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"))
{
...
}