2010-04-06 61 views
2

問題,請看下面的代碼兩個在辛格爾頓C#

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

    static Singleton() {} 
    private Singleton() {} 
} 

問題

1)這裏是什麼靜態構造函數的目的是什麼? (我知道靜態構造函數將在創建類的第一個實例之前被調用)。但是在上面的代碼 的上下文中我不能使用它沒有靜態構造函數嗎?

2)我聽說單身人士的一個優點是它可以延伸到工廠。 由於它是一個封閉的類,你將如何擴展到工廠?你能舉一些例子嗎?

回答

7

靜態構造函數確保單例在使用之前確實不構造。如果靜態構造函數不存在,CLR在運行類型初始化程序時會有更多的餘地。查看我的article on beforefieldinit以及我的博客文章.NET 4 type initialization changes瞭解更多信息。至於把一個單身人士變成一個工廠 - 你真的必須給更多的上下文。你Instance特性都可選擇是否始終返回引用同一對象或沒有,我想......

+0

@喬恩我認爲他們實際上得到的代碼從以前的職位之一: http://stackoverflow.com/questions/2550925/singleton-by-jon-skeet-clarification/2550935#2550935 – 2010-04-06 22:12:25

0
  1. 沒有必要爲一個靜態構造函數。 SKEET!
  2. 我從來沒有聽說過。顯然,如果課程封閉,你不能。但是你可以輕易地將它重寫爲工廠,因爲只有一種方法來實例化它 - 通過屬性。把它改成一個方法,你有一個工廠的開始。該方法可以每次返回相同的實例,或者可以從池中返回一個實例,或者做任何想做的事情。

我不會建議你有工廠屬性,因爲屬性不應該做太多的工作。

+4

LOL在*斯基特!* – 2010-04-06 20:11:28