为什么 C# 垃圾收集器不调用 FileStream 析构函数来释放本机文件句柄

Why C# garbage collector doesn't call FileStream destructor to release native file handle

c# 有 FileStream class 和包装 OS 文件句柄。 FileStream 有 destructor,考虑我们从 FileStream 获取实例并忘记它,如果没有对它的任何引用,GC 必须调用它的析构函数并释放 OS 文件句柄所以为什么它不会发生直到我自己称之为处理或应用程序终止?

FileStream 实现了 IDisposable,这意味着您必须调用 Dispose。请看上一个问题Do I need to dispose the FileStream object?

MS自己告诉你这个https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream?view=netframework-4.7.2

最简单的方法是使用 "using" 语句

    using (FileStream fs = File.Create(path))
    {
        AddText(fs, "This is some text");
        AddText(fs, "This is some more text,");
        AddText(fs, "\r\nand this is on a new line");
        AddText(fs, "\r\n\r\nThe following is a subset of characters:\r\n");

        for (int i=1;i < 120;i++)
        {
            AddText(fs, Convert.ToChar(i).ToString());

        }
    }

如评论中所述,每当 GC 开始收集时,它都会释放无法访问的对象。 但是,为了避免性能问题,直到其中一个 conditions 发生时,GC 才会启动。 最好不要等待垃圾收集器和我们自己快速处理我们的非托管资源。