事件处理程序中的延迟初始化



我想知道如何从事件处理程序"懒惰"实例化对象

如果我有一个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

相关内容

  • 没有找到相关文章

最新更新