2013-04-02 32 views
1

我想取消分配从原来的单对象的存储空间,并创建一个新的使用另一种方法。解除分配和重新实例化新单身

public sealed class ObjectZ { 
    static readonly ObjectZ _instance = new ObjectZ(); 
    private ObjectZ() {} 
    public static ObjectZ Instance{ 
     get { return _instance; } 
    } 
} 

这种方法会是什么样子?

+1

我可以问你这个想法背后的推理吗?正如你可能已经注意到的那样,Singleton是关于访问某个类的私有静态'readonly'实例,以防止你正在描述的行为(并且确保一次只有一个实例)。 – walther

+0

^没错,何况你的建议不会给定你使用的是只读字段您当前的代码工作,你会更好创造缓存“单身”和方法的私有实例的静态访问器类使缓存的项目无效并创建一个新项目。 – Clint

+3

当有2个单身活在同一时间...以下是一些有用的信件在您的调试生命中最美好的时刻是 - @ $%#%#$%# - 当你发现有人正确缓存“使用单身”实例和比你重新创建它:) –

回答

2

单身通常一次创建和存在域的寿命,再造一个单身是不可靠的业务,并通过定义我提供的代码是不是真正的单身。

你似乎是后是可以无效静态访问单个对象的缓存行为。

public static class SingletonAccessor 
{ 
    private static SomeClass _instance; 
    private static object _lock = new Object(); 

    public static SomeClass Singleton 
    { 
     get 
     { 
      lock (_lock) 
      { 
       if (_instance == null) 
       { 
        _instance = new SomeClass(); 
       } 

       return _instance; 
      } 
     } 
    } 

    public static void Recycle() 
    { 
     lock (_lock) 
     { 
      if (_instance != null) 
      { 
       // Do any cleanup, perhaps call .Dispose if it's needed 

       _instance = null; 
      } 
     } 
    } 
} 
+0

如果_lock保持为空,lock(_lock)将引发错误。也许最好将 'private static object _lock;' 更改为'private static object _lock = new Object();'如图所示https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx –

+0

@HB可能,尽管在使用他们在互联网上找到的代码片段的人方面会有一定程度的知识和常识。 – Clint