Шаблон регистрации событий в .net

Какая точка в стандартном шаблоне для делегатов событий в .net? То есть предопределенный делегат EventHandler? Почему бы просто не выбрать наиболее подходящую подпись для этого требования?

Изменить: И, кроме того, нужно ли во всем случае рабски следовать примеру Microsoft?

Ответ 1

В основном для согласованности и управления версиями - с параметром sender, как всегда, System.Object и параметром args, как всегда, System.EventArgs или его потусторонним классом, вы можете изменить передаваемый ему аргумент отправителя как а также изменить тип EventArgs без нарушения существующего кода.

Вся именованная событие .NET, предназначенная для поддержки компонентной разработки, где вызывающий код не находится под контролем разработчика компонента с событиями.

Ответ 2

В С# 1.0 соглашение не имеет большого смысла. В С# 2.0, где есть определенная дисперсия делегата, это имеет смысл.

Если у вас есть метод обработки событий, который действительно не заботится о параметрах, например

public void SaveDocument(object sender, EventArgs args)
{
    // Save the document here
}

теперь вы можете использовать этот метод для подписки на любое событие, которое следует за соглашением, даже если фактический отправитель или аргументы более строго типизированы. Это означает, что вы можете использовать один и тот же обработчик для события клавиатуры, нажатия кнопки и т.д.

Ответ 3

Это хороший вопрос. Еретик, но хороший. Недавно я прочитал сообщение в блоге (я не могу найти ссылку - кто-нибудь имеет эту ссылку), которая развенчала миф, что вам нужно всегда переопределять System.EventArgs, чтобы обеспечить хорошую обработку событий.

Я все согласен и следую правилам, но это тот, который, я думаю, может считаться гибким - если его не избежать. Необходимость постоянно переопределять System.EventArgs для каждого события добавляет к сочетанию рутины - теперь есть еще одна вещь, которую нужно отслеживать.

Наличие "e", предоставляющего элементы, не является более полезным или интуитивным, чем хорошо подобранный набор аргументов. Я не думаю, что аргумент может быть выигран для отправки рекомендуемого шаблона System.EventArg, но я бы включил вас в этот аргумент.

гр

Ответ 4

Он отделяет вызывающего абонента от вызываемого абонента.