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