如果不能保证垃圾收集器会调用它,为什么我们需要一次性模式中的终结器?

问题描述 投票:0回答:1

我的问题是:在C#中,如果不能保证垃圾收集器会调用它,为什么我们需要一次性模式中的终结器?

我无法理解 C# 终结器背后的原理。当我阅读关于如何实现一次性模式的教科书示例时,我的主要困惑出现了。例如,请参阅 Microsoft 的这个教程。考虑这个例子,我有一个简单的一次性类,它创建一个文件,在那里写入“Hello world”,然后在处置时“释放非托管资源” - 删除该文件。如果我故意忘记处置该对象,那么在此示例中,不会调用终结器,并且最终不会删除该文件。

public class FileWriter : IDisposable
{
    private string filePath = "D:\\test\\unmanaged.txt";
    private bool _disposedValue;

    public FileWriter()
    {
        File.WriteAllText(filePath, "hello world");
    }

    ~FileWriter()
    {
        Dispose(false);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposedValue)
        {
            if (disposing)
            {
                // dispose managed state (managed objects)
            }

            // disposing unmanaged resources
            File.Delete(filePath);
            _disposedValue = true;
        }
    }
}

class Program
{
    static void Main()
    {
        // We intentionally don't use "using" here, so we don't dispose of the object 
        // explicitly. In this case, the finalizer is not called, and the 
        // corresponding file is not deleted.
        var myFileWriter = new FileWriter();
    }
}

那么,如果不能保证调用的话,为什么我们需要一次性模式中的终结器呢?

c# garbage-collection idisposable finalizer
1个回答
0
投票

如果我故意忘记处置该对象,那么在此示例中,不会调用终结器,并且最终不会删除该文件。

只是因为您的应用程序立即终止。应用程序终止时不保证最终确定 - 这是最大的努力。在我的机器上,终结器is被调用。这可能取决于您运行代码的方式。

大多数时候,终结器将会执行(最终),因为应用程序保持运行足够长的时间。你不应该依赖终结器,但它们是一个有用的支持。

© www.soinside.com 2019 - 2024. All rights reserved.