2017-04-05 25 views
1

在下面看到的單例類的情況下,初始化MyList的正確方法是什麼?我是直接引用MyList(選項1)還是Instance.MyList(選項2)?這裏最好的做法是什麼?我的直覺說通過實例,但我是自己第二次猜測,無法在任何地方找到明確的答案。引用單身類中的私有單例屬性

public class Foo 
{ 
    private readonly static Lazy<Foo> _instance = 
     new Lazy<Foo>(() => new Foo()); 

    private List<string> MyList; 

    public static Foo Instance 
    { 
     get { return _instance.Value; } 
    } 

    private Foo() 
    { 
     MyList = new List<string> {"a","b","c"}; //Option 1 

     Instance.MyList = new List<string> {"a","b","c"}; //Option 2 
    } 
} 
+0

我不認爲這兩個選項之間有任何區別。就我個人而言,我喜歡使用'this.PropertyName',儘管VS一直在竊聽我刪除'this.'。 –

+0

讓我更新一個更好的例子... – philorube

+0

我不會從構造函數調用實例。再次,我不認爲應該有任何區別,但它似乎很奇怪。 –

回答

4

首先,我會說任何一種方式都很好。這就是說,我更喜歡不使用「實例」標識符的選項。實例的概念確實屬於單例類之外的代碼。在課堂內部,它是一個單身人士的事實應該是衆所周知的。因此,指定實例標識符是多餘的。

+0

邏輯和簡潔。謝謝! – philorube

0

的Singleton模式是創建類型只能有一個實例,但仍然像對待一個類型的實例,而不是被視爲只是一個類型一樣的靜態類型。因此,如果MyList是單個實例的一部分,那麼它應該是該實例上的實例變量,而不是該類的靜態成員。

Singleton模式的一個優點是與使用靜態成員和類相比,它更容易模擬測試,也更容易轉換爲使用多個實例。爲了達到這些目的,使MyList成爲實例成員也有幫助。

如果使用實例,則可以在該實例中編寫MyListthis.MyList或從其他位置編寫Instance.MyList。這些都不是比其他任何更正確的,它真的取決於你找到可讀的東西。重要的是不要混合慣例,這是最差的可讀性選項。

+0

雖然這可能是事實,但它根本不回答問題。 –