Console.WriteLine("=> Critical Message from Car: {0}", msg);
}
static void CarExploded(string msg)
{
Console.WriteLine(msg);
}
Упрощение регистрации событий с использованием Visual Studio
Среда Visual Studio предлагает помощь в процессе регистрации обработчиков событий. В случае применения синтаксиса
+=
при регистрации событий открывается окно IntelliSense, приглашающее нажать клавишу <ТаЬ> для автоматического завершения связанного экземпляра делегата (рис. 12.1), что достигается с использованием синтаксиса групповых преобразований методов.
После нажатия клавиши <ТаЬ> будет сгенерирован новый метод, как показано на рис. 12.2.
Обратите внимание, что код заглушки имеет корректный формат цели делегата (кроме того, метод объявлен как
static
, т.к. событие было зарегистрировано внутри статического метода):
static void NewCar_AboutToBlow(string msg)
{
throw new NotImplementedException;
}
Средство IntelliSense доступно для всех событий .NET Core, ваших событий и событий из библиотек базовых классов.Такая возможность IDE-среды значительно
экономит время, избавляя от необходимости выяснять с помощью справочной системы подходящий тип делегата для применения с заданным событием и формат целевого метода делегата.
Создание специальных аргументов событий
По правде говоря, в текущую итерацию класса
Car
можно было бы внести последнее усовершенствование, которое отражает рекомендованный Microsoft шаблон событий. Если вы начнете исследовать события, отправляемые определенным типом из библиотек базовых классов, то обнаружите, что первый параметр лежащего в основе делегата имеет тип
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);