Язык программирования C#9 и платформа .NET5. Страница 245

После нажатия клавиши <ТаЬ> будет сгенерирован новый метод, как показано на рис. 12.2.

Обратите внимание, что код заглушки имеет корректный формат цели делегата (кроме того, метод объявлен как
staticstatic void NewCar_AboutToBlow(string msg){ throw new NotImplementedException();}Средство IntelliSense доступно для всех событий .NET Core, ваших событий и событий из библиотек базовых классов.Такая возможность IDE-среды значительно экономит время, избавляя от необходимости выяснять с помощью справочной системы подходящий тип делегата для применения с заданным событием и формат целевого метода делегата.
Создание специальных аргументов событий
По правде говоря, в текущую итерацию класса
CarSystem.ObjectSystem.EventArgsПараметр
System.ObjectCarSystem.EventArgspublic class EventArgs{ public static readonly EventArgs Empty; public EventArgs();}Для простых событий экземпляр
EventArgsEventArgsCarEventArgsusing System;namespace CarEvents{ public class CarEventArgs : EventArgs { public readonly string msg; public CarEventArgs(string message) { msg = message; } }}Теперь можно модифицировать тип делегата
CarEngineHandlerpublic class Car{ public delegate void CarEngineHandler(object sender, CarEventArgs e); ...}Здесь при инициировании событий внутри метода
Accelerate()CarthisCarEventArgspublic 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.Objectstatic void CarAboutToBlow(object sender, CarEventArgs e){ // Просто для подстраховки перед приведением // произвести проверку во время выполнения. if (sender is Car c) { Console.WriteLine( $"Critical Message from {c.PetName}: {e.msg}"); }}Обобщенный делегат EventHandler<T>
С учетом того, что очень многие специальные делегаты принимают экземпляр
objectEventArgsEventHandler<T>ТEventArgsCar