【问题标题】:Can't use variable declared in Form1() in Button1_Click()不能在 Button1_Click() 中使用 Form1() 中声明的变量
【发布时间】:2018-11-09 09:28:32
【问题描述】:

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

我正在制作一个模拟蜂巢管理的程序。 在 Form1() 声明中,我初始化了 2 个变量,一个 Worker 对象数组和一个包含工蜂数组的 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 对象。 显然,它不在同一个范围内,因为在 Form1() 中声明了“queen”。 所以我在这段代码中得到一个错误:

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 数组,也不能使用她,因为她的 workers 数组是空的。 如果我尝试实例化一组工人,似乎可以创建他(“Worker[] workers = New Worker[4];”),但不能实例化他的价值观(“workers[0] = ....” ),此时,我的所有代码都带有很好的红色下划线,而相同的代码在 Form1() 方法中就像一个魅力。

以下是问题:

  • 如果不能在其他方法中使用组件,为什么还要在 Form1() 中初始化组件?
  • 如果我直接在 Form1 类中初始化 Workers 数组,为什么会出现大量错误?
  • 显然,我如何在事件监听器中使用我的 Queen 和她的 Worker 数组?

对不起,如果我不清楚并且对于这么简单的问题有很多问题。我读过很多帖子,尤其是这篇帖子:C# referencing a variable from another method,但它没有回答我的问题。

【问题讨论】:

  • 因为该变量是在构造函数public Form1() 的范围内定义的,因此只能在那里使用。在外部声明它以使其具有全局范围。

标签: c# visual-studio scope


【解决方案1】:

>> 显然,我如何在事件监听器中使用我的 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 数组,为什么会出现大量错误?

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

【讨论】:

  • 感谢您的快速回复。就像我说的,我已经尝试使用:public partial class Form1 : Form { Queen queen; 在全局范围内实例化,但它不起作用,因为我的 Worker[] 为空。而且我无法实例化他而不让我的所有代码都出错......
  • 哈!好的,我知道了 !我在 Form1() 中创建了一个新的 Queen 实例,而不是使用全局实例。感谢您回答我所有的问题!祝你有美好的一天:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多