无法在Button1_Click()

时间:2018-05-30 13:35:43

标签: c# visual-studio scope

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

我正在制作一个模拟Beehive管理的程序。 在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数组也不能使用因为她的工人阵列是空的。 如果我尝试对一系列工人进行实例化,那么创建他("工人[]工人=新工人[4];")似乎是有效的,但不能实现他的价值观("工人) [0] = ...."),此时,我的所有代码都用红色加下划线,而相同的代码就像Form1()方法中的一个魅力一样。

以下是问题:

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

很抱歉,如果我不清楚并且对于一个简单的问题有很多问题。我看了很多帖子,特别是这篇帖子:C# referencing a variable from another method但它没有回答我的问题。

1 个答案:

答案 0 :(得分:4)

>>显然,如何在事件监听器中使用我的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文件中定义,由表单设计器生成。您不能在部分类中定义两个(相同的签名)构造函数。所以他们实现了一个为控件进行初始化的方法。在InitializeComponent之前无法访问控件。

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

您无法直接在类中添加可执行代码。它需要在方法/属性