我正在学习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()方法中的一个魅力一样。
以下是问题:
很抱歉,如果我不清楚并且对于一个简单的问题有很多问题。我看了很多帖子,特别是这篇帖子:C# referencing a variable from another method但它没有回答我的问题。
答案 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的数组,为什么会出现错误?
您无法直接在类中添加可执行代码。它需要在方法/属性
中