C#类实例化

3

我是一名编程初学者,看了几篇教程后仍不清楚以下内容:

当点击按钮时,该事件会创建一个类的实例:

private void button2_Click(object sender, RoutedEventArgs e)
{
    int a = 1;
    myClass test = new myClass(a);
}

我的类正在进行长时间处理工作(几分钟)。如果我在按钮上点击5次,它会创建5个实例吗?还是“test”会被覆盖4次?

谢谢


以下是对一个好的初学者问题的两个非常好的答案--需要注意的是,如果myClass的构造函数是同步的,那么您将在UI线程上阻塞相当长的时间。 - Jess
1
只是为了补充一下 - 如果你不想在这种情况下创建额外的对象,当用户过于热衷于点击按钮时,你可以随时使用 Button.Enabled = false; 来禁用按钮。 - Darren
2个回答

8
如果我在我的按钮上点击5次,会创建5个实例吗?还是“test”实例会被覆盖4次?
是的,它将创建5个单独的实例。你正在创建一个对象,在构造后立即超出范围,因此下一次将构造同一类的不同实例。
我假设你计划将处理作为构造函数的一部分进行,要记住这将阻塞UI线程,你的程序将“冻结”-如果你想要执行长时间处理作业,就不应该在UI线程上执行-请查看i.e. BackgroundWorker

谢谢。BackgroundWorker 应该在哪里使用?我猜不是在类内部,而是在按钮函数中使用? - snipef
@snipef:你可以将BackgroundWorker设置为表单上的变量,然后在按钮点击处理程序中直接使用它,前提是你还需要添加额外的DoWork()WorkCompleted()方法(如果需要)。 - BrokenGlass

3

每次单击它都会创建多个实例。但是,如果工作是同步的并阻塞UI线程,则在工作完成之前无法再次单击它。如果您的工作是异步的,则每次单击都会创建一个新实例。

相反,请尝试...

private myClass _test;
private void button2_Click(object sender, RoutedEventArgs e)
{
    int a = 1;

    if (_test == null)
    {
        _test = new myClass(a);
    }
}

尽管如此,我不建议在UI线程上进行同步工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接