В чем причина использования типа Object вместо фактического типа для событий? - PullRequest
0 голосов
/ 11 июня 2009

Я говорю об общей подписи для событий:

Event ( object, args );

и почему бы и нет:

Event ( ImageProcessor, args );

Является ли № 1 тоже затратой на производительность и неясен?

Ответы [ 2 ]

4 голосов
/ 11 июня 2009

Поскольку событие может быть вызвано несколькими различными объектами / типами, и поэтому тип может быть неизвестен во время компиляции.

2 голосов
/ 11 июня 2009

Я думаю, это из-за исторических причин, смешанных с предотвращением дублирования кода.

В .Net 1.0 не было обобщений, поэтому для каждого типа, который может генерировать событие, вы были вынуждены определить делегат обработчика событий. как:

public delegate void TextBoxEventHandler(TextBox sender, EventArgs e);
public delegate void ComboBoxEventHandler(ComboBox sender, EventArgs e);

так что вместо этого разработчики freamework создали один

public delegate void EventHandler(object sender, EventArgs e);

и использовали операторы cast / as.

Начиная с .Net 2.0 у нас есть дженерики, поэтому вы можете определить его один раз так

public delegate void EventHandler<TSender, TEventArgs>(TSender sender, TEventArgs e) where TEventArgs: EventArgs;

или даже

public delegate void EventHandler<TSender, TEventArgs>(TSender sender, TEventArgs e);

А потом используйте вот так.

public event EventHandler<TextBox, string> TextChanged;
public event EventHandler<ComboBox, EventArgs> SomeComboBoxEvent;

Но это сломало бы все приложения, написанные для .Net 1.0 / 1.1, поэтому разработчики фреймворков оставили все как есть. И теперь все используют эти предварительные классы.

Также я не уверен, может ли конструктор Windows Forms использовать универсальный EventHandler. Я никогда не пытался это проверить.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...