2013-08-23 34 views
2

考慮到與類型初始化「標準」 C#實現一個Singleton模式:C#辛格爾頓公共「實例」字段,而不是財產

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

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

    private Singleton() { } 
} 

有沒有在靜態屬性的任何一點?如果靜態字段被標記爲只讀,那麼肯定不能從任何地方寫入,包括從課程外部寫入。對於一個更簡潔的實現,將這項工作?:

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

這似乎沒什麼問題,但我只見過用,所以我不知道是否有什麼不妥,我已經錯過了最上面的一個。

回答

7

靜態屬性中是否有任何一點?

是的。它隱藏了實現細節,該值是從完全相同的類中的字段檢索的。如果你暴露了這個領域,你永遠堅持這個實現(假設你以後不能修改/重建所有引用它的代碼)。如果您使用屬性,你可以在以後:

  • 更改使用Lazy<T>
  • 使用嵌套類中的一個字段,以獲得潛在的懶惰初始化,如果你想擁有類中的其他靜態方法
  • 使用一些新的和時髦的計劃還有待設計

基本上,與財產你有未來的變化的選項。有了領域,你還沒有。

我以前不認爲這是一個相關的區別,但在野田時間我有複雜類型初始化排序問題的情況,使我能控制這種事情非常重要。我已經在早期版本中公開了一個靜態只讀字段,但後來我後悔了:(

公共靜態只讀字段仍然是一個單例 - 它只是給你更少的控制權

順便說一句,你可能希望一個空的靜態構造函數添加到類。見我的singleton implementationsbeforefieldinit文章的更多細節。

+0

我不能得到你的觀點沒有2,你能讓我清楚嗎 –

+0

@SriramSakthivel:請參閱http://csharpindepth.com/Articles/General/Singleton中的選項5。aspx –

+0

感謝Jon,綽綽有餘 –

-2

只讀將意味着它是不能被寫入到一個實例變量,static是一個可以在不實例化對象的情況下讀取的變量,例如,您可以按如下方式調用它們:

//Readonly 
var readonlySingleton = new singleton(); 
var result = readnlySingleton.Instance; 

//static readonly 
var result = singleton.Instance; 
+0

您已經錯過了問題的要點,即暴露屬性或直接暴露字段。 –

1

在單例模式的情況下,使用公共只讀字段而非僅僅是獲取方式並不是很有害。

「標準」實施使用吸氣劑的原因是與公共吸氣劑的其餘部分保持一致,並使您在所有其他情況下采用良好習慣,因爲吸氣劑比吸氣劑更合適(用於添加功能沒有改變接口,例如)

+0

我對「沒有錯」部分提出異議 - 它會在稍後限制您的選擇。看到我的答案。 –

+0

編輯爲'不是很有害':) – wolfovercats

+1

我想這個問題有兩個部分 - 首先它是否違反了創建單個實例的原則,其次它是否是一個好主意,即使它在技術上工作。我認爲「沒有錯」是指問題的第一部分。 –