Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t在Button1_Click()中使用Form1()中声明的变量_C#_Visual Studio_Scope - Fatal编程技术网

C# Can';t在Button1_Click()中使用Form1()中声明的变量

C# Can';t在Button1_Click()中使用Form1()中声明的变量,c#,visual-studio,scope,C#,Visual Studio,Scope,我正在学习C#,在其他语言中遇到了一个非常简单的问题,这让我很生气。。。我肯定错过了一些显而易见的东西,但经过几个小时的寻找和尝试,我终于找到了答案:p 我正在制作一个模拟蜂巢管理的程序。 在Form1()声明中,我初始化了两个变量,一个是Worker对象数组,另一个是包含Worker对象数组的Queen对象: public Form1() { InitializeComponent(); Worker[] workers = new Worker[4];

我正在学习C#,在其他语言中遇到了一个非常简单的问题,这让我很生气。。。我肯定错过了一些显而易见的东西,但经过几个小时的寻找和尝试,我终于找到了答案:p

我正在制作一个模拟蜂巢管理的程序。 在Form1()声明中,我初始化了两个变量,一个是Worker对象数组,另一个是包含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);
    }
接下来,使用Form1()中声明的Queen对象,使用我的“Button1”将工作分配给蜜蜂。 显然,它不在同一范围内,因为“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 Queen;”…),我不能向他传递工作者数组,也不能使用她,因为她的工作者数组为null。 如果我尝试实例化一个Worker数组,它似乎可以创建他(“Worker[]workers=New Worker[4];”),但不能实例化他的值(“workers[0]=…”),此时,我所有的代码都用红色下划线很好地加了线,而相同的代码在Form1()方法中就像一个符咒

以下是问题:

  • 如果不能在其他方法中使用Form1()中的组件,为什么必须初始化它们
  • 如果我直接初始化Form1类中的Workers数组,为什么会出现大量错误
  • 显然,如何在事件侦听器中使用我的Queen和她的Worker数组
对不起,如果我不清楚,对于这么简单的问题,有很多问题。我读过很多帖子,特别是这篇帖子:但它并没有回答我的问题。

>很明显,我如何在事件侦听器中使用我的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");
        }
    }
}
正如您所看到的,我会在字段前面加上
\uu
。这不是必需的,但它提高了可读性。这样我就知道我是在处理一个领域,而不是一个本地领域


>>如果不能在其他方法中使用Form1()中的组件,为什么必须初始化它们

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


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

不能直接在类中添加可执行代码。它需要位于方法/属性中,显然,我如何在事件侦听器中使用我的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");
        }
    }
}
正如您所看到的,我会在字段前面加上
\uu
。这不是必需的,但它提高了可读性。这样我就知道我是在处理一个领域,而不是一个本地领域


>>如果不能在其他方法中使用Form1()中的组件,为什么必须初始化它们

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


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


不能直接在类中添加可执行代码。它需要位于方法/属性中,因为该变量是在构造函数
public Form1()的范围内定义的,因此只能在那里使用。在外部声明它以给它一个全局范围。因为该变量是在构造函数
public Form1()
的范围内定义的,因此只能在那里使用。在外部声明以提供全局范围。感谢您的快速回复。正如我所说,我已经尝试使用:
public分部类Form1:Form{Queen Queen;
在全局范围内实例化,但由于我的Worker[]为null,所以它不起作用。我无法实例化他,而我的所有代码都会出错……哈!好了!我在Form1()中创建了Queen的新实例而不是使用全局类。感谢您回答我的所有问题!祝您愉快:)感谢您的快速回复。正如我所说,我已经尝试使用:
public partial class Form1:Form{Queen Queen;
在全局范围内实例化,但自从我的工作人员[]之后,它就不起作用了是null。我不能实例化他,否则我的代码都会出错…哈!好的,明白了!我在Form1()中创建了Queen的一个新实例,而不是使用全局实例。感谢您回答我的所有问题!祝您愉快:)