-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();
    }
}

看起来它们的行为都相同,我想知道它们之间是否有任何重要区别,或者选择其中一个只是“最佳实践”。提前致谢

4

5 回答 5

3

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

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

于 2012-04-19T06:56:58.573 回答
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

希望这可以帮助

于 2012-04-19T06:53:58.523 回答
0

唯一可能的区别是您的程序架构所暗示的区别。在哪里初始化是执行流程的问题,所以应该决定在哪里初始化你的obj成员。考虑到这obj是你的类的全局变量,你可以就地初始化它:

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

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

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

于 2012-04-19T07:01:29.870 回答
0

范围有一个主要区别。

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

在第二种和第三种情况下,它在函数中声明,因此只能由该函数访问。

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

TestWindow objTestWindow = new TestWindow(); // will not create object
TestWindow.Show(); // will create an object
于 2012-04-19T07:02:18.963 回答