|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||
Именование делегатов и событий12.04.2022, 21:26. Показов 3128. Ответов 11
Метки нет (Все метки)
Есть такая приставка для делегатов как
EventArgs. Иногда используют что-то типо ActionHandler.Вот я хотел бы понять как правильно именовать делегаты. Как я понял, EventArgs используется в том случае, если указывается sender. Или как?
0
|
|||||||||||
| 12.04.2022, 21:26 | |
|
Ответы с готовыми решениями:
11
Получения событий без делегатов Применение делегатов в качестве обработчиков событий |
|
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
|
|||||||
| 13.04.2022, 00:05 | |||||||
Чего-нибудьHandler. А EventArgs это вообще конкретный тип.
2
|
|||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 13.04.2022, 00:17 [ТС] | |
|
John Prick, а чем отличается обработчик событий от конкретного типа?
А в каких случаях лучше использовать именно EventArgs тип, а в каких делегаты?
0
|
|
|
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
|
|||
| 13.04.2022, 00:24 | |||
|
1
|
|||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 13.04.2022, 01:28 [ТС] | |
|
John Prick, тут не совсем понимаю саму суть.
Вот я могу в метод делегата передать всё что угодно. Хоть целый паровоз чисел. А могу сделать отдельный тип, унаследовать его от EventArgs и передать в качестве параметра. Почему яблоко, а не ботинок?
0
|
|
|
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
|
|||||||
| 13.04.2022, 10:07 | |||||||
|
Да, если создаётся свой собственный делегат, то в него можно передавать всё, что угодно, что требуеся по сути задачи. Надо паровоз чисел - передаём этот паровоз, надо строки - передаём их; любой другой объект ничем от этого не отличается, в том числе и объект типа EventArgs. Если вам в своей задаче удобнее и логичнее использовать EventArgs или его наследников - используйте их. В случае же, если этот тип требуется потому, что он указан в определении делегата какого-то библиотечного класса, придётся использовать его. Чуть примера:
2
|
|||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 13.04.2022, 10:29 [ТС] | |
|
John Prick, не совсем тот ответ, которого я ожидаю услышать.
Сам смысл: для чего он нужен -- я так и не понял.
0
|
|
|
Модератор
|
|||||||||||||||||
| 13.04.2022, 11:14 | |||||||||||||||||
|
Это рекомендованный базовый тип аргумента для делегата используемого для создания события. Пример RoutedEvent - у него аргумент RoutedEventArgs производный от EventArgs.Рекомендованные делегаты - это EventHandler и EventHandler<T>.Для первого аргументом может быть только EventArgs, для второго - любой тип, но рекомендуется чтобы был производный от EventArgs.Handler используется в именах делегатов безотносительно того будут ли они использованы для объявления события или нет.Экземпляров может быть много, а метод обработчик будет для них один. И он как-то должен различать какой-конкретно экземпляр вызвал событие. EventArgs используется когда у события нет параметра кроме самого источника. Производные от EventArgs используются когда все параметры события (кроме источника) собираются в один общий объект. Если у события несколько параметров (кроме источника), то EventArgs обычно не используется. Обработчик (слушатель) - это метод, который является членом класса или структуры. EventArgs - это базовый класс. Он сам или производный от него класс может быть параметром делегата, но ни как не использоваться вместо делегата. Делегат - это сигнатура допустимого метода. EventArgs - тип параметра метода. Но параметр не может же использоваться вместо метода. Добавлено через 13 минут Если вы делаете событие "для себя", то можете объявить, например, такой делегат:
INoifyPropertyChanged.PropertyChanged.И введение своего события запутает всех кто будет использовать ваш тип. Как быть? Можно расширить аргумент события:
Вы можете передать все данные через стандартный PropertyChanged, но с вашим типом аргумента.Стандартные слушатели будут получать базовый PropertyChangedEventArgs и работать с ним как всегда.Расширенные (продвинутые) слушатели будут приводить аргумент к типу ExtPropertyChangedEventArgs и получать из него дополнительные данные.
1
|
|||||||||||||||||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 13.04.2022, 11:47 [ТС] | |
|
Элд Хасп, резюмирую: если делегат может усложниться -- лучше сделать отдельный тип для параметра унаследованный от EventArgs. Если пользователь решит сделать делегату "апргейт" -- ему нужно будет расширить класс указанный в параметре старого делегата и создать новый делегат с ним.
Как я понимаю, это в дальнейшем может в каких-то местах упростить код, так как один тип подобен другому. Есть ли какие-то примеры, которые наглядно показывают удобство применения подобного рода подхода?
0
|
|
|
Модератор
|
|||
| 13.04.2022, 12:04 | |||
|
Этот пример из реальной реализации. Возможно даже на Форум загружал её - надо поискать. Если вы создаёте абсолютно новый свой тип, то вам его нужно хорошо документировать. Использование же .Net типа позволяет создать понятный всем код без излишнего документирования.
1
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 13.04.2022, 14:32 | ||
Сообщение было отмечено limeniye как решение
РешениеПолезно, если надо знать, что что-то случилось, но абсолютно не нужно знать что именно.
2
|
||
| 13.04.2022, 16:16 [ТС] | |
|
Не по теме: kolorotur, я ждал именно этого ответа. Спасибо.
0
|
|
| 13.04.2022, 16:16 | |
|
Помогаю со студенческими работами здесь
12
Применение делегатов в качестве обработчиков событий Написать код с использованием событий и делегатов Использование делегатов и событий при смене поля "телефон" объекта Игра "Такси" с использованием делегатов и событий Разработка делегатов, событий, анонимных методов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 11.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|