我什么时候应该初始化对象

时间:2012-04-19 06:49:47

标签: c# oop

我正在试图找出它们之间的区别:

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();
    }
}
看起来它们看起来都是一样的,我想知道它们之间是否有任何重要的区别,或者只是选择其中之一的“最佳实践”。 提前致谢

5 个答案:

答案 0 :(得分:3)

您的问题的答案是您应该在使用变量之前初始化变量

字段初始化程序在构造函数之前运行,构造函数在任何其他方法之前运行,例如Window_Loaded。这很重要,因为如果你在初始化之前尝试使用你的对象,你将得到一个NullReferenceException。如果在调用Window_Loaded之前没有使用你的对象,那么它没有任何区别。

答案 1 :(得分: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的情况下,Window_Load将仅在所有ui之后被调用元素已加载

希望这有帮助

答案 2 :(得分:0)

此处可能唯一区别是程序架构隐含的差异。初始化的位置是执行流程的问题,因此应该决定它在哪里成为初始化obj成员的更好地方。考虑到obj是您班级的全局变量,您可以在适当位置初始化它:

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

..或者如果这是一个大对象,并且在表单执行流程中可能不会使用,您可能希望仅在请求用户,说ButtonClick

答案 3 :(得分: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版本,这可能会导致一些问题。 此外,如果在方法中初始化对象,请注意,如果在此方法之前的任何方法尝试使用此对象,则可能会失败。 另一方面,它只取决于你想做什么。从某种意义上说,所有用法都是正确的。

答案 4 :(得分:0)

范围存在主要差异。

与第一种情况一样,它可以在您在类中定义的每种方法中访问 简而言之,它是全球性的。

并且在其声明函数的第二和第三种情况下,只有该函数可以访问它。

现在另一个区别在于第一个和第二个案例对象将在您声明时 创建它的对象,但在第三种情况下,它将在实际加载它时声明。

喜欢

TestWindow objTestWindow = new TestWindow(); // will not create object
TestWindow.Show(); // will create an object