关闭控制台应用程序时如何调用Singleton的析构函数?

时间:2018-06-15 14:20:07

标签: c# singleton

如果我当前的应用程序正在执行我的要求,我会感到有点困惑。我想基本上只创建一个Singleton,当Console应用程序终止时,调用Singleton的析构函数。我有它所以当我按下ENTER时控制台应用程序将终止,但我不确定这是否正在做我想要的。当我在析构函数中放置一个断点时,它只有在我按Enter键时才会被击中。我只是想确保我所做的是正确的,如果没有,我该怎么做才能改变它。

这是我的单身人士:

 public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
    public static Singleton Instance { get { return lazy.Value; } }
    private Singleton() { }
    ~Singleton()
    {
        Console.WriteLine("Destructor Called."); // Breakpoint here
    }
}

在我的主要地方:

    public static void Main(string[] args)
    {
        Singleton instance = Singleton.Instance;
        Console.ReadLine();
    }

编辑:搞定了,谢谢!

1 个答案:

答案 0 :(得分:1)

您无法以编程方式调用析构函数。它总是由垃圾收集中的.NET CLR调用。但是对于你的单身人士,我强烈反对使用析构函数。

如果要释放任何资源,建议implement IDisposable interface或者任何自定义接口实现都可以释放任何资源,因为在Singleton上实现IDisposable很奇怪。

public sealed class Singleton : IDisposable
{
    private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
    public static Singleton Instance { get { return lazy.Value; } }
    private Singleton() { }
    ~Singleton()
    {
        Console.WriteLine("Destructor Called."); // Breakpoint here
    }

    void IDisposable.Dispose()
    {
        Console.WriteLine("Dispose Called.");
        GC.SuppressFinalize(this);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Singleton.Instance.ToString();
        ((IDisposable)Singleton.Instance).Dispose();
        GC.Collect();
    }
}