2013-04-02 64 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