Среда Visual Studio предлагает помощь в процессе регистрации обработчиков событий. В случае применения синтаксиса +=
После нажатия клавиши <ТаЬ
> будет сгенерирован новый метод, как показано на рис. 12.2.Обратите внимание, что код заглушки имеет корректный формат цели делегата (кроме того, метод объявлен как static
static void NewCar_AboutToBlow(string msg)
{
throw new NotImplementedException();
}
Средство IntelliSense
доступно для всех событий .NET Core, ваших событий и событий из библиотек базовых классов.Такая возможность IDE-среды значительно экономит время, избавляя от необходимости выяснять с помощью справочной системы подходящий тип делегата для применения с заданным событием и формат целевого метода делегата.Создание специальных аргументов событий
По правде говоря, в текущую итерацию класса Car
System.Object, в то время как второй — тип, производный от System.EventArgs.Параметр System.Object
Car), а второй параметр — информацию, относящуюся к обрабатываемому событию. Базовый класс System.EventArgs представляет событие, которое не сопровождается какой-либо специальной информацией:public class EventArgs
{
public static readonly EventArgs Empty;
public EventArgs();
}
Для простых событий экземпляр EventArgs
EventArgs. В этом примере предположим, что есть класс по имени CarEventArgs, который поддерживает строковое представление сообщения, отправленного получателю:using System;
namespace CarEvents
{
public class CarEventArgs : EventArgs
{
public readonly string msg;
public CarEventArgs(string message)
{
msg = message;
}
}
}
Теперь можно модифицировать тип делегата CarEngineHandler
public class Car
{
public delegate void CarEngineHandler(object sender, CarEventArgs e);
...
}
Здесь при инициировании событий внутри метода Accelerate()
Car (посредством ключевого слова this) и экземпляр типа CarEventArgs. Например, рассмотрим следующее обновление:public void Accelerate(int delta)
{
// Если этот автомобиль сломан, то инициировать событие Exploded.
if (carIsDead)
{
Exploded?.Invoke(this, new CarEventArgs("Sorry, this car is dead..."));
}
...
}
На вызывающей стороне понадобится лишь модифицировать обработчики событий для приема входных параметров и получения сообщения через поле, доступное только для чтения. Вот пример:
static void CarAboutToBlow(object sender, CarEventArgs e)
{
Console.WriteLine($"{sender} says: {e.msg}");
}
Если получатель желает взаимодействовать с объектом, отправившим событие, тогда можно выполнить явное приведение System.Object
static void CarAboutToBlow(object sender, CarEventArgs e)
{
// Просто для подстраховки перед приведением
// произвести проверку во время выполнения.
if (sender is Car c)
{
Console.WriteLine(
$"Critical Message from {c.PetName}: {e.msg}");
}
}
Обобщенный делегат EventHandler