这是一个副本:C#中的单例是什么?
如何实现Singleton,以便在不使用所有引用时释放/处理对象实例?当任何身体想要一个Singleton实例时,它会根据需要延迟加载.
单身者不应该动态处理:一旦创建,它们就会存在,直到应用程序的生命周期结束.Singleton意味着它只有一个实例.
即使您的Singleton保留了您想要动态释放和重新保留的资源,也不应该销毁并重新创建Singleton实例.这与模式的常见含义和用法相矛盾,这可能(最多)导致团队中的沟通问题,或者(最坏的情况下)应用程序中的微妙错误.
相反,您可以让Singleton对象在内部管理该资源:如果它已经使用了一段时间,或者如果它的引用计数降为0,则释放它.
您还应该考虑使用Factory来访问该资源.这使您可以更自由地控制相关资源的处理.您还可以在内部重复使用创建的对象,实际上将对象计数保持在最多1.
正如其他一些答案所说,在 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,而不会自己创建引用,这意味着您的资源会经常重新加载。我想如果单例实例有时是您传递的某些类的成员,那么这种模式效果最好。