Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

После нажатия клавиши <ТаЬ> будет сгенерирован новый метод, как показано на рис. 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<T>
С учетом того, что очень многие специальные делегаты принимают экземпляр
object
EventArgs
EventHandler<T>
Т
EventArgs
Car