Member 13189777 Ответов: 2

Как автоматически добавить значение в поле


Привет Ребята

Я надеюсь, что смогу объяснить эту проблему. У меня есть два класса class1 и class2

Домашнее животное и владелец домашнего животного.

public class Petowner
    {
        private String Name;
        private int age;

        public Petowner()
        {
            Name = "Joppe";
            age = 100;

        }
    }

и
class Pet

    {
        private string name;
        private int hunger;

        public Pet()
        {
            name = "Pelle";
            hunger = 100;
        }

        public void SetHunger(int _hunger)
        {
            hunger = hunger - _hunger;
        }
    }


Что я уже пробовал:

Я хочу иметь по одному экземпляру каждого класса

затем, пока я запускаю программу (делаю что-то с экземплярами pet и petowner). затем я хочу сделать так, чтобы поле голода автоматически обезжиривалось во время работы программы. Возможно ли это?

Спасибо

Йохан

2 Ответов

Рейтинг:
5

F-ES Sitecore

В дополнение к решению 1 Вы можете вести список домашних животных вместо того чтобы работать только с одним

public class Pet
{
    public string Name { get; set; }
    public int Hunger { get; private set; }
    public bool IsAlive { get; private set; }

    public Pet(string name)
    {
        Name = name;
        Hunger = 100;
        IsAlive = true;
    }

    public void SetHunger(int _hunger)
    {
        Hunger = Hunger - _hunger;

        if (Hunger <= 0)
        {
            IsAlive = false;
        }
    }
}


private static List<Pet> pets = new List<Pet>();

static void Main(string[] args)
{
    var myTimer = new System.Timers.Timer();
    myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
    myTimer.Interval = 2000;
    myTimer.Start();

    string line;

    // Type a pet name followed by [RETURN] to create a pet of that name
    while ((line = Console.ReadLine()) != "q")
    {
        Pet pet = CreatePet(line);
        // you can do something with pet here if you want
    }
}

public static Pet CreatePet(string name)
{
    Pet pet = new Pet (name);

    pets.Add(pet);

    return pet;
}

public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
{
    foreach (Pet pet in pets)
    {
        pet.SetHunger(10);

        if (pet.IsAlive)
        {
            Console.WriteLine("Pet:{0} Hunger:{1}", pet.Name, pet.Hunger);
        }
        else
        {
            Console.WriteLine("{0} died", pet.Name);
        }
    }

    pets.RemoveAll(p => p.IsAlive == false);
}


Member 13189777

Он идеально подходит именно так, как я хотел. Единственное что я получаю это описание кода серьезности ошибки состояние подавления строки файла проекта
Ошибка CS0123 нет перегрузки для' DisplayTimeEvent 'соответствует делегату 'ElapsedEventHandler'

в этой строке -- & gt; new ElapsedEventHandler(DisplayTimeEvent);
например, выглядит так
также mytimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);

F-ES Sitecore

Этот код работает нормально для версии .net, которую я использую (4.5), возможно, вам придется обратиться к документам для вашей версии и настроить их по мере необходимости, или просто попробовать

также mytimer.Прошедшее Время += DisplayTimeEvent;

или тип

также mytimer.Истекший +=

в visual studio нажмите TAB и он создаст правильную сигнатуру метода для вас

Member 13189777

Хммм... когда я нажимаю TAB, он делает эту подпись...
частных статических недействительным MyTimer_Elapsed1(объект отправителя, ElapsedEventArgs е)
я положил это

{
по каждому элементу (любимчика любимчика домашних животных)
{
домашнее животное.Сетхангер (10);

если (пет.Isalive в)
{
Приставка.WriteLine ("Pet: {0} Hunger:{1}", pet.Name, домашнее животное.Голод);
}
еще
{
Приставка.WriteLine ("{0} умер", pet.Name);
}
}

домашние животные.Метод removeall(Р =&ГТ; п.Очередь isalive == ложь);
}

Это не работает :(

F-ES Sitecore

Обновите свой исходный вопрос, чтобы перечислить весь код, который вы используете в данный момент.

Member 13189777

использование системы;
использование системы.Коллекции.Общий;
использование System. Linq;
используя системы.Текст;

пространство имен ConsoleApptimertest2
{
домашнее животное класса
{

public string Name { get; set; }
public int Hunger { get; private set; }
public bool IsAlive { get; private set; }

публичный питомец(строковое имя)
{
Имя name;
Голод = 100;
IsAlive = true;
}

общественного недействительными SetHunger(инт _hunger)
{
Голод = Голод-_hunger;

если (голод <= 0)
{
IsAlive = false;
}
}
}
}




использование системы;
использование системы.Коллекции.Общий;
использование System. Linq;
используя системы.Текст;
использование системы.Таймеры;

пространство имен ConsoleApptimertest2
{
программа занятий
{
частная статический список<любимчика&ГТ; домашние животные = новый список<любимчика&ГТ;();
static void Main (string[] args)
{
var myTimer = новая система.Таймеры.Таймер();
также mytimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
также mytimer.Интервал = 2000;
также mytimer.Начать();

строки;

// Введите имя питомца, а затем [RETURN], чтобы создать питомца с таким именем
while ((line = Console.ReadLine ())! = " q")
{
Домашнее животное домашнее животное = CreatePet(линия);
// вы можете сделать что-то с домашним животным здесь, Если хотите
}
}

частных статических недействительным MyTimer_Elapsed1(объект отправителя, ElapsedEventArgs е)
{
по каждому элементу (любимчика любимчика домашних животных)
{
домашнее животное.Сетхангер (10);

если (пет.Isalive в)
{
Приставка.WriteLine ("Pet: {0} Hunger:{1}", pet.Name, домашнее животное.Голод);
}
еще
{
Приставка.WriteLine ("{0} умер", pet.Name);
}
}

домашние животные.Метод removeall(Р =&ГТ; п.Очередь isalive == ложь);
}



public static Pet CreatePet(строковое имя)
{
Pet pet = новый питомец (имя);

домашние животные.Добавить (домашнее животное);

возвращение питомца;
}

общественная статический недействительным DisplayTimeEvent(источник, объект, ElapsedEventHandler е)
{

Приставка.WriteLine ("hej");
Приставка.Линия чтения();
по каждому элементу (любимчика любимчика домашних животных)
{
домашнее животное.Сетхангер (10);

если (пет.Isalive в)
{
Приставка.WriteLine ("Pet: {0} Hunger:{1}", pet.Name, домашнее животное.Голод);
}
еще
{
Приставка.WriteLine ("{0} умер", pet.Name);
}
}

домашние животные.Метод removeall(Р =&ГТ; п.Очередь isalive == ложь);
}
}
}

Member 13189777

Я взял код из метода public static void DisplayTimeEvent(object source, ElapsedEventHandler e)
и скопировал его на старый метод, и теперь он работает идеально, спасибо лояльным ребятам!!!

Рейтинг:
15

jimmson

Здравствуйте, да, есть способ, с помощью таймеров.

В C# есть несколько классов таймеров, лучше всего посмотреть на все из них и выбрать тот, который соответствует вашим потребностям!
Все вокруг .Чистые таймеры-сравнение[^]

Обновление:

private static Pet vov;

static void Main(string[] args)
{
    vov = new Pet();
    var myTimer = new System.Timers.Timer();
    myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
    myTimer.Interval = 1000;
    myTimer.Start();

    while (Console.Read() != 'q')
    {

    }
    Console.ReadKey();
}

public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
{
    vov.SetHunger(10);
    Console.Write("\r{0}", DateTime.Now);
}


Member 13189777

Но я понятия не имею, как это сделать... я новичок, и я пытался сделать то, что вы говорите раньше, и я не понимаю, как сделать метод потока для обновления экземпляра pet.

jimmson

Вы можете хранить экземпляр pet в каком-то частном поле. Затем получите доступ к нему из метода обратного вызова потока и вызовите SetHunger. Покажите мне код, который вы пробовали, чтобы я мог помочь вам с ним.

Member 13189777

static void Main(string[] args)
        {
            pet Vov = new pet();
            Timer myTimer = new Timer();
                  myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
                myTimer.Interval = 1000;
                 myTimer.Start();
          
      while (Console.Read() != 'q')
                   {
               
            }
        }
        public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
    {
      Console.Write("\r{0}", DateTime.Now);
            
    }


Это код, который я сделал, но я вообще не знаю, как это сделать... Я в тупике..

jimmson

Я обновил свой ответ кодом.

Member 13189777

спасибо, но я не могу "увидеть Вову в методе DisplayTimeEvent?
Я получаю эту ошибку...

я не видел
частный статический питомец ВОВ;
но когда я добавляю его, я получаю
CS0246 C# не удалось найти тип или имя пространства имен (отсутствует ли директива using или ссылка на сборку?)

jimmson

Вы скопировали "private static Pet vov;" с самого начала моего кода? Я протестировал код (и отладил), и он работает.

Member 13189777

где я могу поместить частного статического питомца vov;?

Member 13189777

Я все исправил ... Кажется, это работает!! Спасибо!!

jimmson

Пожалуйста! Счастливого коддинга.

Member 13189777

Извините, я получаю ошибку при запуске кода
он говорит System. NullReferenceException: 'ссылка на объект не установлена на экземпляр объекта.' в этой строке - - - - > vov. SetHunger(10);

Я понятия не имею почему

jimmson

Вы, наверное, что-то изменили.

Member 13189777

да, я исправил это, так что код работает сейчас, но он не обновляет поле голода. он просто открывает окно, показывающее время. это время обновления, но ничего не могу поделать я пытался поставить ВОВ.ShowHunger(); ( новый метод, я добавил.) но DisplayTimeEvent выброшены голода или показать его.

jimmson

Программирование - это решение проблем. Если вы собираетесь удалять мой ответ как решение каждый раз, когда вы нарушаете свой код, я не думаю, что этот разговор действительно куда-то идет.