2012-10-01 80 views
7

辛格爾頓用C#實現的可能是這樣的:靜態屬性和單例之間有什麼區別?

public class Singleton 
{ 
    private static Singleton instance; 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      instance = new Singleton(); 
     } 
     return instance; 
     } 
    } 
} 

如果我使用靜態實現它想:

public static class Globals{ 
    public static Singleton Instance = new Singleton(); 
} 
這樣

,應用程序還應該只得到一個實例整個應用程序。 那麼這兩種方法有什麼區別?爲什麼不直接使用靜態成員(更簡單直接)?

回答

8

如果使用第二種方法:

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

沒有什麼防止有人從做:

Singleton anotherInstance = new Singleton(); // Violates singleton rules 

還沒有得到相同的延遲初始化您的第一個版本(嘗試)實現,再加上你使用的是一個公共字段,如果你需要改變取值時發生的情況,它將在未來不允許你具有相同的靈活性。

需要注意的是.NET 4提供了一個潛在的更好的方法,使一個單:

public class Singleton 
{ 
    private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(()=> new Singleton()); 

    private Singleton() {} 

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

這是很好的,因爲它是完全懶完全線程安全的,但也很簡單。

+0

我們需要聲明*靜態構造函數*在這裏線程安全的? –

+0

@CongLong不與'懶惰'版本。這是非常好的,它提供了適當的線程安全性和完美的懶惰實例化,並帶有一個簡單的API。 –

+0

啊,是的,我明白了,+1 –

-1

下面是靜態的,單件之間的一些差異:

  1. 單例是一個模式而靜態爲關鍵字。
  2. 單例類可以有靜態和非靜態方法,但靜態類只能有靜態成員和方法。
  3. 我們可以在Singleton類中實現接口,但在靜態類中我們不能實現接口。
  4. 我們可以擴展Singleton類,而我們不能使用靜態類,即Singleton類可以從任何類的類中派生。

更多static vs Singleton

相關問題