2012-04-19 76 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 
相关问题