Невозможно использовать переменную, объявленную в Form1 () в Button1_Click () - PullRequest
0 голосов
/ 30 мая 2018

Я изучаю C # и столкнулся с очень простой проблемой в других языках, которая сводит меня с ума здесь ... Я, должно быть, упускаю что-то очевидное, но после пары часов поиска и поиска решений, я прихожу: p

Я делаю программу, имитирующую управление Улей.В объявлении Form1 () я инициализирую 2 переменные, один массив объектов Worker и объект Queen, который содержит массив рабочих bee:

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» используется для назначения работыпчела, использующая объект Queen, объявленный в Form1 ().Очевидно, что это не в той же области видимости, так как "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 = New Worker [4];»), но не для воплощения его ценностей («worker [0] = ....»), и в этот момент весь мой код красиво подчеркнут красным цветом, в то время как тот же код работает как талисман в методе Form1 ().

Итак, вот вопросы:

  • Почему мы должны инициализировать компоненты в Form1 (), если мы не можем использовать их в другом методе?
  • Почему я получаю петлю ошибок, если я выполняю инициализацию массива Workers непосредственно в классе Form1?
  • И, очевидно, как я могу использовать мою Queen и ее массив Worker в прослушивателе событий?

Извините, если мне не ясно, и из-за большого количества вопросов по проблеметак просто.Я прочитал много сообщений, в частности это сообщение: C # ссылается на переменную из другого метода , но это не отвечает моей проблеме.

1 Ответ

0 голосов
/ 30 мая 2018

>> И, очевидно, как я могу использовать мой Queen и ее массив Worker в приемнике событий?

Вы определили переменную 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.


>> Почему я получаю петлю ошибок, если я выполняю инициализацию массива Workers в классе Form1 напрямую?

Вы не можете добавлять исполняемый код в класс напрямую.Это должно быть в методе / свойстве

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...