Почему CompositionTarget.Rendering принимает EventArgs вместо RenderingEventArgs?

Событие CompositionTarget.Rendering - это простой старый EventHandler с простым старым EventArgs. Однако в реальной жизни он, по-видимому, всегда получает экземпляр RenderingEventArgs. Таким образом, ваш обработчик событий должен начать с того, что вы выбрали EventArgs, чтобы извлечь из них полезную информацию.

Почему это не событие типа EventHandler<RenderingEventArgs>, поэтому мы могли бы легче перейти к аргументам (и что более важно, чтобы мы могли даже знать, что существуют аргументы)? Почему Microsoft выбрала для этого события неправильную подпись?

Я задавался вопросом о обратной совместимости - был ли релиз, где RenderingEventArgs еще не существует? - но это, похоже, не так. Согласно MSDN, RenderingEventArgs и CompositionTarget были представлены в той же версии на обеих платформах - в WPF оба были добавлены в .NET 3.0; в Silverlight оба были добавлены в Silverlight 3.0.

Если он дает какой-либо намек, я наткнулся на старый дискуссионный поток, где кто-то сказал: "Делегат использует EventArgs, потому что некоторые вид победы производительности при сортировке, делая это". Если кто-то может объяснить, какой может быть победа в производительности, я бы согласился принять это как ответ.

Ответы

Ответ 1

Маршиллинг-победа, возможно, является инструментом управления памятью низкого уровня. Поскольку EventArgs является наиболее распространенной формой аргумента для события, вероятно, будут предварительно выделенные буферы в реализации обработки событий низкого уровня для плагина. Это может быть даже победой на некоторых платформах и только с интенсивным рендерингом.

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

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