如何管理Singleton实例?

Nir*_*ren 4 c# singleton

这是一个副本:C#中的单例是什么?

我不认为它是重复的,因为我在寻找的是在不使用时释放/处理Singleto对象的最佳策略.

如何实现Singleton,以便在不使用所有引用时释放/处理对象实例?当任何身体想要一个Singleton实例时,它会根据需要延迟加载.

Pét*_*rök 7

单身者不应该动态处理:一旦创建,它们就会存在,直到应用程序的生命周期结束.Singleton意味着它只有一个实例.

即使您的Singleton保留了您想要动态释放和重新保留的资源,也不应该销毁并重新创建Singleton实例.这与模式的常见含义和用法相矛盾,这可能(最多)导致团队中的沟通问题,或者(最坏的情况下)应用程序中的微妙错误.

相反,您可以让Singleton对象在内部管理该资源:如果它已经使用了一段时间,或者如果它的引用计数降为0,则释放它.

您还应该考虑使用Factory来访问该资源.这使您可以更自由地控制相关资源的处理.您还可以在内部重复使用创建的对象,实际上将对象计数保持在最多1.


her*_*ter 5

正如其他一些答案所说,在 C# 中实现单例模式是一般单例的最佳资源之一。

如果您希望在其他地方没有引用您的单例时将其释放,您可以从上述站点中取出您最喜欢的模式并将实例包装到 WeakReference 中例如:

public sealed class Singleton
{
    static private readonly WeakReference _instanceReference =
        new WeakReference(Singleton.LoadInstance());
    static public Singleton Instance
    {
        get { return Singleton.GetInstance(); }
    }

    static private Singleton() { }

    static private Singleton LoadInstance()
    {
        // load from expensive resource;
        return new Singleton();
    }

    static private Singleton GetInstance()
    {
        Singleton result = _instanceReference.Target as Singleton;
        if (result == null)
        {
            // TODO: consider thread safety
            result = LoadInstance();
            _instanceReference.Target = result;
        }

        return result;
    }

    private Singleton()
    {
        //
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,消费者很可能只会调用您的资源Singleton.Instance,而不会自己创建引用,这意味着您的资源会经常重新加载。我想如果单例实例有时是您传递的某些类的成员,那么这种模式效果最好。