Шаблон подписи события в.net
Какой смысл в стандартном шаблоне для делегатов событий в.net? Т.е. предопределенный делегат EventHandler? Почему бы просто не выбрать наиболее подходящую подпись для требования?
Редактировать: И кроме того, нужно ли рабски следовать примеру Microsoft во всех случаях?
4 ответа
Это главным образом для согласованности и управления версиями - с sender
Параматер как всегда System.Object и тому args
Параметр, как всегда System.EventArgs, или его класс dervied, вы можете изменить передаваемый ему аргумент отправителя, а также впоследствии изменить тип EventArgs, не нарушая существующий код.
Вся идиома событий.NET была разработана для поддержки разработки на основе компонентов, когда вызывающий код не находится под контролем разработчика компонента с событиями.
В C# 1.0 соглашение не имело большого смысла. В C# 2.0, где существует определенная дисперсия делегатов, это имеет больше смысла.
Если у вас есть метод обработки событий, который на самом деле не заботится о параметрах, например,
public void SaveDocument(object sender, EventArgs args)
{
// Save the document here
}
теперь вы можете использовать этот метод для подписки на любое событие, которое следует соглашению, даже если фактический отправитель или аргументы более строго типизированы. Это означает, что вы можете использовать один и тот же обработчик для события клавиатуры, нажатия кнопки и т. Д.
Это хороший вопрос. Еретично, но хорошо. Недавно я прочитал пост в блоге (я не могу найти ссылку - есть ли у кого-нибудь эта ссылка), который развенчал миф о том, что вам нужно всегда переопределять System.EventArgs, чтобы обеспечить хорошую обработку событий.
Я все за соглашение и следую правилам, но я думаю, что это то, что можно смирить - если не избежать. Необходимость постоянно переопределять System.EventArgs для каждого события добавляет к связыванию подпрограммы - теперь есть еще одна вещь, которую нужно отслеживать.
Наличие "e", которое предоставляет членов, не более полезно или интуитивно понятно, чем хорошо названный набор аргументов. Я не думаю, что аргумент можно выиграть, чтобы отправить рекомендованный шаблон System.EventArg, но я бы посоветовал вам сделать этот аргумент.
Р.П.