#c# #visual-studio #event-handling
#c# #visual-studio #обработка событий
Вопрос:
Итак, я пытаюсь изучать события, и я сделал все, что нужно было сделать, чтобы вызвать и прослушать простое событие, но я не получаю никакой обратной связи при запуске кода. Событие просто игнорируется, и вычисляется только Hello world. У меня есть два класса: один — простой класс Car, другой — класс Owner.
В классе car я создаю событие и вызываю его в соответствии с тем, как указано в документации Microsoft. В классе owner я прослушиваю его через вызывающую функцию, а затем подписываюсь на нее. Тем не менее, ничего не происходит. Пожалуйста, помогите, я собираюсь отказаться от этого.
//--------CAR CLASS-----//
using System;
namespace EventsTutorial
{
public class Car
{
public event EventHandler<int> CarOnEvent;
public Car(string name, string colour, int id)
{
Name = name;
Colour = colour;
IsOn = false;
Id = id;
TurnOn(id);
}
public string Name { get; set; }
public string Colour { get; set; }
public bool IsOn { get; private set; }
public int Id { get; set; }
protected virtual void TurnOn(int e)
{
EventHandler<int> handler = CarOnEvent;
handler?.Invoke(this, e);
}
}
}
//-----------OWNER CLASS-------------
using System;
namespace EventsTutorial
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine(" World!");
Car mycar = new Car("Toyota", "Black", 1);
mycar.CarOnEvent = Mycar_CarOnEvent;
}
private static void Mycar_CarOnEvent(object sender, int e)
{
Car var = (Car)sender;
Console.WriteLine("The car {0}, is now on", var.Name);
}
}
}
Комментарии:
1. Кроме того, ознакомьтесь с рекомендациями msdn, касающимися событий, именования и так далее: learn.microsoft.com/en-us/dotnet/standard/design-guidelines /…
2. И это также должно представлять интерес — isocpp.org/wiki/faq /…
Ответ №1:
Вы вызываете TurnOn
Car
конструктор, прежде чем кто-либо будет присоединен к событию.
Вы должны сначала подключиться к событию, а затем вызвать TurnOn
.
//New car constructor...
public Car(string name, string colour, int id)
{
Name = name;
Colour = colour;
IsOn = false;
Id = id;
}
//New TurnOn
protected virtual void TurnOn()
{
EventHandler<int> handler = CarOnEvent;
handler?.Invoke(this, this.Id);
}
//New main...
public static void Main(string[] args)
{
Console.WriteLine(" World!");
Car mycar = new Car("Toyota", "Black", 1);
mycar.CarOnEvent = Mycar_CarOnEvent;
myCar.TurnOn()
}
Комментарии:
1. Ах, это то, к чему я тоже клонил.
2. Спасибо! Это сработало! Но я не понимаю, почему. Как это работает, когда мы подписываемся на событие перед вызовом? В моей голове вы не можете прослушать что-то, что еще не было вызвано. Так ли это работает? Потому что, если я вызываю метод TurnOn, а затем ставлю subscribe, он не запускается
3. @SentryCOD Нет, это работает наоборот. Событие — это не что иное, как синтаксический сахар вокруг делегатов, когда вы подписываетесь на событие, оно создает делегата (или составного делегата, но это другая история), который указывает на присоединенную функцию, затем, когда вы вызываете это событие, то, что вы делаете, — это не что иное, как вызов делегата, который выполнит указанноефункция, если нет функции для вызова, она ничего не делает. Надеюсь, это немного прояснит это для вас 🙂