2016-03-25 32 views
0

在我的應用程序中,我需要幾個單例類。他們每個人都有一些其他單身類的領域使用它們。下面我就重建簡單的例子問題:包含彼此字段的單例類空引用異常

public sealed class A 
{ 
    private B b = B.Instance; 

    private static readonly A instance = new A(); 
    public static A Instance { get { return instance; } } 
    static A() { } 
    private A() { } 

    public void Do() 
    { 
     b.ToString(); 
    } 
} 

public sealed class B 
{ 
    A a = A.Instance; 

    private static readonly B instance = new B(); 
    public static B Instance { get { return instance; } } 
    static B() { } 
    private B() { } 

    public void Do() 
    { 
     a.ToString(); 
    } 
} 


class Program 
{ 
    static B b = B.Instance; 
    static A a = A.Instance; 

    static void Main(string[] args) 
    { 
     b.Do(); 
     a.Do(); 
    } 
} 

空引用異常來,因爲字段爲空。那麼如何初始化和使用這種相互關聯的單例類呢?

+1

爲什麼要嘗試這樣做?這種交叉依賴性通常是設計不好的標誌。 – Thomas

回答

0

構造函數不會並行運行,所以當第一個被創建時,第二個Singleton尚未創建。

相反的屬性的值設置爲直接你很可能寫B類是這樣的:

private A AProp { 
    get { 
    if(a == null) 
     a = A.Instance; 

    return a; 
    } 
} 

你會做A類的另一種方式圓相同的,因此所獲得的價值被推遲到第一次訪問並且當時另一個Singleton已經被創建。

在什麼情況下,確切地說這是一個好主意是另一個問題。尤其是考慮到不是在本地字段中訪問它,您總是可以使用A.Instance訪問它(因此,本地字段在該點處變得多餘)。