2017-02-15 33 views
4

我需要一個單例代碼。我讀喬恩斯基特的page對單身和選擇這種模式(#4)根據他的建議:基於Jon Skeet的Singleton的Simpleton Singleton

public sealed class Singleton 
{ 
    private static readonly Singleton instance = new Singleton(); 

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Singleton(){} 

    private Singleton(){} 

    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 

然後,我通過幾個步驟去修改這個適合我的情況:

第1步:我不需要一個懶惰的實現,所以我拿出靜態構造函數(如由Jon在他的文章的末尾建議):

​​

步驟2:我再換出了「實例」 Singleton類與Logging類我一起工作:

public sealed class Singleton 
{ 
    private static readonly Logging instance = new Logging(); 

    private Singleton(){} 

    public static Logging Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 

步驟3: ReSharper的,然後告訴我,我應該使用自動屬性我的「實例」屬性:

public sealed class Singleton 
{ 
    private Singleton(){} 

    public static Logging Instance { get; } = new Logging(); 
} 

第4步: ReSharper的,然後告訴我,我應該關掉這個靜態類:

public static class Singleton 
{ 
    public static Logging Instance { get; } = new Logging(); 
} 

我留下的東西與原來的很不一樣。我知道在設置一個線程安全的Singleton時很容易出錯。

所以我想問:我的任何一個步驟是否使我的課不再是一個很好的Singleton實現?

+3

這根本不是Singleton實現。你創建的只是**另一個**類型的共享靜態變量。 –

回答

3

做我的任何步驟使我的課不再是一個很好的Singleton實現?

是的,他們這樣做。

無論如何,您在步驟#1中刪除的行爲都是實現細節。刪除空的靜態構造函數是好的;如果你想強制延遲初始化,Lazy<T>反正是一個更好的方法,即使它有更多的開銷。

在步驟2中,您的對象完全停止爲單例,因爲您不再控制創建對象的多少個實例(Logging)。

我想說,不是一個單身人士有資格成爲「不是一個好的Singleton實現」。

+0

我想我所尋找的不是一個簡單的單身人士然後。我可能不得不另外發佈一個問題。謝謝你的回答! – Vaccano

+0

Incase任何人都有興趣,我在這裏發佈我的後續問題到這個:http://stackoverflow.com/q/42259505/16241 – Vaccano