不能在 Button1_Click() 中使用在 Form1() 中声明的变量



我正在学习 C#,并在其他语言中遇到了一个非常简单的问题,这让我在这里生气......我一定错过了一些明显的东西,但是经过几个小时的寻找和尝试解决方案,我来:p

我正在制作一个模拟蜂巢管理的程序。 在 Form1(( 声明中,我初始化了 2 个变量,一个是 Worker 对象数组,一个是包含 worker bee 数组的 Queen 对象:

public Form1()
{
InitializeComponent();
Worker[] workers = new Worker[4];
workers[0] = new Worker(new string[] { "Nectar Collector", "Honey Manufacturing" });
workers[1] = new Worker(new string[] { "Egg Care", "Baby Bee Tutoring" });
workers[2] = new Worker(new string[] { "Hive Maintenance", "Sting Patrol" });
workers[3] = new Worker(new string[] { "Nectar Collector", "Honey Manufacturing", "Egg Care", "Baby Bee Tutoring", "Hive Maintenance", "Sting Patrol" });
Queen queen = new Queen(workers);
}

接下来,我的"Button1"用于使用 Form1(( 中声明的 Queen 对象将工作分配给蜜蜂。 显然,它不在同一个范围内,因为"queen"是在 Form1(( 中声明的。 所以我在这个代码中得到一个错误:

private void button1_Click(object sender, EventArgs e)
{
if(***queen***.AssignWork(workerBeeJob.Text, (int)shifts.Value))
{
MessageBox.Show("The job '" + workerBeeJob.Text + "` will be done in");
}

"'女王'这个名字在实际语境中并不存在"。

如果我尝试在我的类范围内实例化 Queen 对象(只需使用"Queen queen";...(,我不能向他传递 Workers 数组,也不能使用她,因为她的 worker 数组为空。 如果我尝试实例化一组工作线程,它似乎可以创建他("worker[] workers = New Worker[4];"(,而不是实例化他的值("workers[0] = ...."(,此时,我的所有代码都很好地用红色下划线,而相同的代码在 Form1(( 方法中就像一个魅力。

所以这里有一些问题:

  • 如果我们不能在另一种方法中使用组件,为什么我们必须在 Form1(( 中初始化它们?
  • 如果我直接在类 Form1 中初始化工作线程数组,为什么会出现大量错误?
  • 显然,如何在事件侦听器中使用我的女王和她的 Worker 数组?

对不起,如果我不清楚,并且对于这么简单的问题有很多问题。我已经阅读了很多帖子,特别是这篇文章:C#引用了另一种方法的变量,但它没有回答我的问题。

>> 显然,如何在事件侦听器中使用我的 Queen 和她的 Worker 数组?

您将 queen 变量定义为局部变量。这意味着当它超出范围时,它将不再可用。您需要将 queen 变量定义为字段。

public class Form1: Form
{
private Queen _queen;
public Form1()
{
InitializeComponent();
Worker[] workers = new Worker[4];
workers[0] = new Worker(new string[] { "Nectar Collector", "Honey Manufacturing" });
workers[1] = new Worker(new string[] { "Egg Care", "Baby Bee Tutoring" });
workers[2] = new Worker(new string[] { "Hive Maintenance", "Sting Patrol" });
workers[3] = new Worker(new string[] { "Nectar Collector", "Honey Manufacturing", "Egg Care", "Baby Bee Tutoring", "Hive Maintenance", "Sting Patrol" });
_queen = new Queen(workers);
}
private void button1_Click(object sender, EventArgs e)
{
if(_queen.AssignWork(workerBeeJob.Text, (int)shifts.Value))
{
MessageBox.Show("The job '" + workerBeeJob.Text + "` will be done in");
}
}
}

如您所见,我会在我的字段前面加上一个_.这不是必需的,但它正在提高可读性。这样我总是知道我正在处理一个领域而不是一个本地。


>> 如果我们不能在另一种方法中使用组件,为什么我们必须在 Form1(( 中初始化它们?

InitializeComponent();Form1.designer.cs文件中定义,由表单设计者生成。不能在分部类中定义两个(相同的签名(构造函数。因此,他们实现了一个为控件进行初始化的方法。在初始化组件之前,这些控件不可访问。


>> 如果我直接在类 Form1 中初始化 Worker 数组,为什么会出现大量错误?

不能直接在类中添加可执行代码。它需要位于方法/属性中

最新更新