2009-07-30 65 views
2

可能重複:
Best Practice: Initialize class fields in constructor or at declaration?初始化成員變量的最佳做法?

我與C#的工作,但是這可能適用於Java(或任何其他語言,允許這種行爲爲好)......

哪種方式是最好的/最佳做法?假設我總是需要_memberVar

1.

class MyClass 
{ 
    private Dictionary<int, string> _memberVar = new Dictionary<int, string>(); 

    public MyClass() {} 
} 

- 或 -

2.

class MyClass 
{ 
    private Dictionary<int, string> _memberVar = null 

    public MyClass() 
    { 
     _memberVar = new Dictionary<int, string>(); 
    } 
} 

現在讓我們說MyClass具有向上的10個...構造函數所以我不想在所有這些構造函數中都有_memberVar = new Dictionary<int, string>();。第一種方式有什麼問題嗎?由於

編輯: 我意識到我可以鏈的構造函數,但是這是一個相當複雜的類...一些構造函數調用基,一些呼叫其他的構造已經等等

+0

http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at-declaration – M4N 2009-07-30 14:21:44

+0

的重複和對不起有關重複... – Polaris878 2009-07-30 14:27:14

回答

2

你不必初始化成員變量,但是如果你這樣做不會傷害它。成員變量會自動獲取其默認值,通常爲對象的null和基元類型的默認值(例如int0)。

至於具有不同的構造函數,您不必在每個版本中重複成員初始化,因爲您可以像重載方法一樣調用任何其他重載構造函數。

關於最佳實踐,親自我在構造函數中初始化成員變量,因爲這是我想要「構造」我的對象到一個穩定的狀態。換句話說,即使我會在聲明它們的時候初始化成員變量,但是在構造函數被調用時,就好像我正在擦除乾淨的石板。

0

理想情況下,你應該爲此使用依賴注入。這意味着您將它留給您的類的實例化器來創建新的依賴關係實例,並將它們注入到類的新實例中,而不是讓類自己創建依賴關係。

0

第一種方法是我通常做的方法,如果所有的構造函數都將它初始化爲相同的值,那麼這是完全可以接受的。我絕對更喜歡靜態變量,以避免顯式聲明靜態構造函數。

1

關於_memberVar在10個構造函數中被初始化:我認爲你需要重新考慮你的類。這聽起來很過分。如果你在每個構造函數中都做了相同的工作,那麼你違反了DRY。相反,嘗試採用這種結構:

public class MyClass { 
    Foo _foo; 
    Bar _bar; 
    Baz _baz; 

    public MyClass(Foo foo, Bar bar, Baz baz) { 
     _foo = foo; _bar = bar; _baz = baz; 
    } 

    public MyClass(Foo foo, Bar bar) : this(foo, bar, new Baz()) { } 

    public MyClass(Foo foo) : this(foo, new Bar()) { } 

    public MyClass() : this(new Foo()) { } 
} 

注意,我故意沒呼叫到每一個休息的最廣泛的構造,而是級聯,以便在情況下繼承行爲默認的變化感爲每個。

對於聲明中的成員初始化,如果成員不是使用構造函數的參數之一構造的,我更願意在聲明時進行初始化。