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

本文关键字:对象 初始化 什么时候 我应该 | 更新日期: 2023-09-27 18:31:41

我试图弄清楚两者之间的区别是什么:

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)之前运行。这很重要,因为如果您在初始化对象之前尝试使用对象,您将获得 NullReferenceException。如果在调用对象之前不使用对象Window_Loaded则没有区别。

在声明上初始化字段与在构造函数的第一行初始化它相同,因此

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

希望这有帮助

这里可能存在的唯一区别是程序体系结构所隐含的差异。 初始化位置是执行流的问题,因此您应该决定在哪里更适合初始化obj成员。考虑到obj是类的全局变量,您可以就地启动它:

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

..或者,如果这是一个大对象,并且在表单的执行流程期间可能不会使用,您可能只想在用户的临时请求下初始化它,例如ButtonClick

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

范围上有一个主要区别。

就像在第一种情况下一样,它可以在类中定义的每个方法中访问简而言之,它是全球性的.

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

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

喜欢

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