Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何称呼单身人士';在关闭控制台应用程序时是否使用析构函数?_C#_Singleton - Fatal编程技术网

C# 如何称呼单身人士';在关闭控制台应用程序时是否使用析构函数?

C# 如何称呼单身人士';在关闭控制台应用程序时是否使用析构函数?,c#,singleton,C#,Singleton,如果我当前的应用程序符合我的要求,我有点困惑。我基本上只想创建一个单例,当控制台应用程序终止时,调用单例的析构函数。我有它,所以控制台应用程序将在我按下ENTER键时终止,但我不确定这是否符合我的要求。当我在析构函数中放置断点时,只有当我按Enter键时,它才会被击中。我只是想确保我所做的是正确的,如果不是,我怎么能改变它 这是我的单身汉: public sealed class Singleton { private static readonly Lazy<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
    }
}

编辑:成功了,谢谢

不能以编程方式调用析构函数。在垃圾收集中,.NET CLR总是调用它。然而对于你的单身汉,我强烈反对使用析构函数

建议是,如果您想释放任何资源或任何自定义接口实现也可以用于释放任何资源,因为在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();
    }
}
公共密封类单例:IDisposable
{
private static readonly Lazy Lazy=new Lazy(()=>new Singleton());
公共静态单例实例{get{return lazy.Value;}}
私有单例(){}
~Singleton()
{
WriteLine(“调用了析构函数”);//此处为断点
}
void IDisposable.Dispose()无效
{
Console.WriteLine(“Dispose Called”);
总干事(本);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
Singleton.Instance.ToString();
((IDisposable)Singleton.Instance.Dispose();
GC.Collect();
}
}

终结器(即析构函数)供GC调用<代码>处置供开发人员调用。单例很少需要解构。考虑使用一个实现“代码> IDISPOSTABLE < /C> >的对象的单个实例。说。终结器永远不能保证运行,并且不应该访问类之外的任何内容-事情可能处于不一致的状态。在单例错误实践中不实现IDisposable吗?@Cuphead,请提供更多详细信息。在析构函数/终结器/
Dispose
/随便什么中,您到底想做什么?你为什么需要它?
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();
    }
}