2012-04-19 77 views
-1

我試圖找出之間有什麼區別:我應該什麼時候初始化對象

public partial class TestWindow : Window 
{ 
    object obj = new object(); 
    public TestWindow() 
    { 
     InitializeComponent(); 
    } 
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 
} 

和:

public partial class TestWindow : Window 
{ 
    object obj; 
    public TestWindow() 
    { 
     InitializeComponent(); 
     obj = new object(); 
    } 
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 
} 

和:

public partial class TestWindow : Window 
{ 
    object obj; 
    public TestWindow() 
    { 
     InitializeComponent(); 

    } 
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     obj = new object(); 
    } 
} 

它看起來像他們所有的行爲都是相同的,我想知道它們之間是否有任何重要的區別,或者它只是選擇其中之一的「最佳實踐」。 在此先感謝

+1

那麼可能是你應該嘗試與F11調試和找到它。初始化組件將初始化許多事物,並查看對象正在初始化的位置以及實際需要初始化的位置。 – Milee 2012-04-19 06:52:14

+0

就性能而言,沒有區別。 – TRR 2012-04-19 06:52:40

+0

[在構造函數中實例化對象]的可能的重複(http://stackoverflow.com/questions/4772808/instantiating-objects-in-the-the-constructor) – V4Vendetta 2012-04-19 06:53:00

回答

3

您的問題的答案是您應該在使用它們之前初始化變量

字段初始值設定項在構造函數之前運行,並且構造函數在任何其他方法(如Window_Loaded)之前運行。這很重要,因爲如果在初始化之前嘗試使用對象,則會得到NullReferenceException。如果在調用Window_Loaded之前不使用對象,那麼它沒有任何區別。

+0

+1。在[有效的C#:比爾瓦格納改進你的C#的50種具體方法]中也深入地解釋了這個問題(http://www.amazon.com/Effective-Covers-4-0-Specific-Development/dp/0321658701) – Eddie 2012-04-19 07:08:18

0

在聲明初始化場是一樣的在構造函數的第一行初始化它使

public partial class TestWindow : Window 
{ 
    object obj = new object(); 
    public TestWindow() 
    { 
     InitializeComponent(); 
    } 
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 
} 

這一個相同

public partial class TestWindow : Window 
{ 
    object obj; 
    public TestWindow() 
    { 
     obj = new object(); 
     InitializeComponent(); 
    } 
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 
} 

,當你初始化在Window_Load中,只有當事件被觸發時,對象纔會被初始化......可以或不可以發生:)在WinForm或WPF的情況下,只有在加載所有UI元素後纔會調用Window_Load

希望這有助於

+0

AFAIK,在構造函數被調用之前,第一個對象被初始化。 – daryal 2012-04-19 07:02:57

+0

@daryal編譯器將負責在每個構造函數的開始處生成代碼。 – Eddie 2012-04-19 07:14:11

+0

@eddflrs有差異,請檢查以下內容http://www.yoda.arachsys.com/csharp/constructors.html;事實上,java和c#在使用基類時有一個主要區別。 – daryal 2012-04-19 07:59:19

0

區別在於可能是這裏是你的程序架構隱含着差異。在哪裏初始化是一個執行流程的問題,所以應該決定哪裏是一個更好的地方來初始化您的obj成員。考慮到obj是你的類的全局變量,你可以initilaize它只是在地方:

public class TestWindow 
{ 
    object obj = new object(); 
    public TestWindow() 
    { 
    ... 
    } 
} 

..或者,如果這是一個很大的對象和可能無法被執行流程中的表格上使用,你可以想要初始化它只有對用戶的明確請求,比如ButtonClick

0
public partial class TestWindow : Window 
{ 
    object obj = new object(); 
    public TestWindow() 
    { 
     InitializeComponent(); 
    } 
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 
} 

這裏的對象在調用構造函數之前被初始化。

public partial class TestWindow : Window 
{ 
    object obj; 
    public TestWindow() 
    { 
     InitializeComponent(); 
     obj = new object(); 
    } 
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 
} 

對象在構造函數中初始化。

public partial class TestWindow : Window 
{ 
    object obj; 
    public TestWindow() 
    { 
     InitializeComponent(); 

    } 
    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     obj = new object(); 
    } 
} 

對象在調用window_Loaded時被初始化。

就我個人而言,我從來沒有在構造函數被調用前創建對象。如果您將代碼重構爲IOC版本,這可能會導致一些問題。另外,如果你在一個方法中初始化一個對象,只要注意,如果這個之前的任何方法試圖使用這個對象,它可能會失敗。另一方面,這取決於你想要做什麼。從某種意義上說,所有用法都是正確的。

0

有一個主要的區別。

就像第一種情況一樣,它可以在您定義的每種方法中訪問 簡而言之,它是全球性的。

而在第二和第三種情況下,它的聲明在函數中,所以它只能被該函數訪問。

現在的另一個區別是在第一個和第二個case對象將聲明當你創建它的對象和它的對象,但在第三種情況下它會聲明實際加載它時。

TestWindow objTestWindow = new TestWindow(); // will not create object 
TestWindow.Show(); // will create an object 
相關問題