我想知道如何从事件处理程序"懒惰"实例化对象
如果我有一个WinForms应用程序和两个按钮,例如:
public partial class Form1 : Form
{
//MyClass obj = new MyClass();
MyClass obj;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
obj = new MyClass();
obj.StartWork();
}
private void button2_Click(object sender, EventArgs e)
{
obj.StopWork();
}
}
由于我们不需要在用户单击 button1 之前访问 MyClass 的成员,因此仅在该事件处理程序中实例化类是有意义的。但是,单击第二个按钮将引发空引用异常,因为该范围内的 obj 变量不引用任何内容。
Lazy<T>
.
public partial class Form1 : Form
{
Lazy<MyClass> obj = new Lazy<MyClass>();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
obj.Value.StartWork();
}
private void button2_Click(object sender, EventArgs e)
{
obj.Value.StopWork();
}
}
访问其 Value
属性将强制创建对象。
还可以向构造函数提供自定义初始化函数Lazy
。
这应该会停止异常:
private void button2_Click(object sender, EventArgs e)
{
// You need to make sure that obj is not null when this button is clicked.
// One way is to disable this button until button1 is pressed.
// Or you can add this if statement.
if(obj != null)
{
obj.StopWork();
}
}
但是你的陈述
因为该范围内的 obj 变量不引用任何内容
是错误的。 obj
可以通过Form1
类中的所有方法访问。因此,当您首先单击button1
时,您将实例化您的类变量 obj
,它可以在类中的任何位置使用。但是您需要添加if(obj != null)
以防用户先单击button2
。