C# 如何正确处置对象?为什么代码分析总是改变主意?

C# 如何正确处置对象?为什么代码分析总是改变主意?,c#,dispose,C#,Dispose,我昨天参加了一个项目,我们决定将两个项目合并为一个项目,并将两者的功能结合起来(它们基本上吸收了我们) 问题是,他们的某个地方有内存泄漏,他们让我找到并杀死它 我在VisualStudio中运行了一个代码分析,得出了一长串警告,其中大部分我们可以忽略,我正在尝试修复的是对象处理问题。我从来没有特别注意过一些事情,我很惊讶地发现,让代码分析来确定某些事情是正确的并不容易 代码的开头是这样的: StreamWriter SW = new StreamWriter(File.Create("folde

我昨天参加了一个项目,我们决定将两个项目合并为一个项目,并将两者的功能结合起来(它们基本上吸收了我们)

问题是,他们的某个地方有内存泄漏,他们让我找到并杀死它

我在VisualStudio中运行了一个代码分析,得出了一长串警告,其中大部分我们可以忽略,我正在尝试修复的是对象处理问题。我从来没有特别注意过一些事情,我很惊讶地发现,让代码分析来确定某些事情是正确的并不容易

代码的开头是这样的:

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();
但是代码分析表明,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");
}
正在处理的软件消失了,但它仍然说File.Create没有沿着所有代码路径进行处理,只有一个代码路径,因此没有意义,我尝试为File.Create添加一个单独的Using语句,并分别创建/写入文件,但代码分析仍然捕获到它

这似乎很容易理解,除非VS有假阳性或其他什么

无论如何,谢谢你给我时间来读这篇文章

~z~编辑

我在最初的帖子中撒谎了,当我添加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();
}

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

using (Stream stream = File.Create("folder/file.txt"))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        ...
    }
}
假设如果
File.Create
成功,那么
StreamWriter
构造函数也会成功,这可能是合理的,但VS可能不知道这一点。它也可能不知道处理写操作会处理流

但就我个人而言,我会使用,这样可以避免问题,而且更简单:)


我将研究使用File.CreateText,看看你的解决方案是否能让VS通过它谢谢,使用File.CreateText是有效的,尽管它可能是它的放置方式,而不是CreateText完成的,尽管如此,OP中的最终设置通过了检查,非常感谢您:数据关于ObjectDisposedException的消息很有趣,因为根据IDisposable接口的约定,它永远不会发生在Dispose()上。实际上,多次处置一个对象是安全的。在调用Dispose()以外的其他实例方法时,可以获得该异常。
using (TextWriter writer = File.CreateText("folder/file.txt"))
{
    ...
}