2010-11-18 128 views
5

哪個聲明/實例化更好,爲什麼?在構造函數或類的頂部創建一個對象

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow() 
    { 
     _test = new Test(); 
    } 
} 

OR

public class MainWindow 
{ 
    private Test _test = new Test(); 

    public MainWindow() 
    { 

    } 
} 
+1

重複的一個.... 請參閱http://stackoverflow.com/questions/298183/c-member-variable-initialization-best-practice – Tony 2010-11-18 21:31:49

回答

2

問自己這個問題:將其他構造函數添加到MainWindow時會發生什麼?你是否想記住引用其他構造函數以確保_test被正確初始化?或者如果_test不使用另一個構造函數進行初始化?

個人在創建UI組件時,我會將盡可能多的失敗點移出構造函數,並且我會將其移動到Loaded事件處理函數中,或者像在選項2中那樣保留它。

0

後者,因爲聲明和初始化發生在同一行......更易於閱讀,很難犯了一個錯誤。

2

我會去的第三個選項:

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow(Test test) 
    { 
     _test = test; 
    } 
} 

通過注入的依賴使代碼更容易進行單元測試。

+0

OP有'_test'作爲一個成員變量該類意味着它不應該與'MainWindow'分開測試,而應該針對'MainWindow'。 IOW:IoC不適合'_test'。 – slugster 2010-11-18 21:33:44

+0

這種方式可以讓你在測試中嘲笑它。 – 2010-11-18 21:34:52

+0

@slugster:這取決於Test做了什麼。如果它向MainWindow提供任何類型的數據,它應該被注入。如果您可以從您的測試中提供該數據(通過存根/模擬對象),您將獲得預定義(可測試)結果。 – jgauffin 2010-11-18 21:37:05

1

這是一樣的

int i; 
... 
i = 0; 

int i = 0; 

我的看法是,初始化應該是貼近聲明如果可能的話,在理想的情況下它的一部分之間的差異。除了可讀性的獎勵之外,您忘記初始化的機會更小。所以第二個變體是更好的。

2

這是更好,當你去寫子類來做到這一點的構造函數中,使之平原創建對象時所發生的事情,尤其是。

通常,雖然這是一個品味的問題,最重要的是要一致在您的選擇。

1

我不認爲你可以說一個聲明是優於其他的,它是所有關於你的表格的邏輯,如果你不想在表單上開始測試啓動,但上的按鈕點擊,然後第一個聲明更好。

+0

+1:懶惰的實例化可能非常有用。 – Tony 2010-11-18 21:35:33

+0

沒錯,如果「新測試()」涉及大量內存使用情況,只需在需要時調用,比如按鈕事件或創建類型測試類時勢在必行。 – 2010-11-18 21:40:46

0

第二個是最乾淨的imho。我通常只需在構造函數中創建需要用參數初始化的對象。

無參數

public class MainWindow 
{ 
    private Test _test = new Test(); 

    public MainWindow() 
    { 

    } 
} 

與參數:

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow() 
    { 
     _test = new Test("abc") 
    } 
} 

由於傑克遜教皇說,它可以是一個好主意,添加一個構造函數爲對象,以使其更容易開始使用DI之後。你可以閱讀有關DI/IoC的位置:http://www.codeproject.com/KB/architecture/DependencyInjection.aspx

0

在你給,沒有的要選擇較好的例子。這兩個代碼片段在構造類時都會實例化一個成員變量。唯一真正的區別是,在第二種情況下,成員在構造函數執行前之前被初始化爲

它真正有所作爲的唯一時間是當成員變量需要傳遞給它的構造函數的信息時,Main類獲取它的構造函數。然後你別無選擇,只能使用第二個選項。

例如:

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow(int i) 
    { 
     _test = new Test(i); 
    } 
} 
0

它不會有所作爲可言,因爲編譯器生成完全相同一樣IL。在可讀性方面,這只是個人品味的問題。我更喜歡後者的版本,但與readonly修改:

public class MainWindow 
{ 
    private readonly Test _test = new Test(); 

    public MainWindow() 
    { 

    } 
} 

,這是特別容易閱讀和維護時,班裏有一個以上的構造函數。

+0

在給出的例子中它是真的,但是當MainWindow從其他類派生時,會有區別:第二種情況'Test'將在基構造函數之前構造。 – Vlad 2010-11-18 21:46:55

相關問題