|
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
|
||||||
Что такое событие, для чего оно нужно28.01.2016, 12:19. Показов 3987. Ответов 28
Помогите разобраться, что ли
Вчера пытался понять что же такое событие, для чего оно нужно, зачем ему делегат Ну и собственно вот попытки
То есть нельзя чтобы, например, подписчики были типа int и типа void?
0
|
||||||
| 28.01.2016, 12:19 | |
|
Ответы с готовыми решениями:
28
Swapfile.sys Что это такое и для чего оно? Подскажите что такое md5 шифрование пароля и для чего оно надо ?
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 28.01.2016, 13:48 | |||
|
0
|
|||
|
TheGreatCornholio
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
|
| 28.01.2016, 14:10 | |
|
Вчера не слабо помучался с событиями.
На всякий случай, сообщу, что такой код не потокобезопасен, нет проверки на null (а вдруг никто не подписался?), а также желательно отписываться от событий (-=). Лучше полностью почитать. http://codeblog.jonskeet.uk/20... -with-c-6/ http://stackoverflow.com/quest... ead-safety http://stackoverflow.com/quest... t-practice
0
|
|
|
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
|
|
| 28.01.2016, 14:22 [ТС] | |
|
Спасибо
А может ли быть у события несколько делегатов?
0
|
|
|
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
|
||||||||||||||||||
| 28.01.2016, 14:29 | ||||||||||||||||||
|
Простым языком
![]() Делегат - это класс, который хранит в себе сигнатуру метода. Сигнатура метода - это тип возвращаемого значения и тип(ы) параметров (public string Foo (int a, bool b){}). Экземпляр делегата может хранить в себе один и более методов (указателей на методы) с соответствующей ему сигнатурой. События имеют больше семантическую разницу от делегатов. Философский смысл. По сути в событии создается поле типа нужного нам делегата, а также функции для добавления туда методов. События - некая "обертка" над делегатом. У вас есть класс Game. У которого есть, например, функция Step - шаг персонажа на другую клетку, которая что-то возвращает, а может и нет - не суть). Программа работает, все отлично, вы ходите, собираете разные монетки. И, когда монеток n-е количество, побеждаете. Но вам хочется отображать статистику, например количество собранных монеток, чтоб при каждой взятой монетке у вас на экране счет увеличивался на 1 (например в лейбле lblScore). Ваш класс Game вообще не в курсе ни о каком лейбле, он просто занимается своей задачей. Для этого у вас есть делегат (названия нужно более обобщенные давать)
Все контролы в ВинФорм содержат события, что бы сообщать пользователя о неких действиях. Можно конечно использовать просто делегаты. И, например, в одном из свойств передавать делегат, который что-то там делает, но согласитесь, что так куда запутаннее: Передавать объекту ссылку на метод.. сигнализировать о неком события куда приятнее ![]() пс. писал не в студии, может где-то печатался, но ведь в данном случае важна суть кода, а не грамотность)
2
|
||||||||||||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 28.01.2016, 14:35 | ||
|
Правильней было бы сказать, что делегат — это класс, который хранит в себе сигнатуру метода, тип его возвращаемого значения и список ссылок на подписчиков и их подписанные методы.
1
|
||
|
TheGreatCornholio
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
||||||||
| 28.01.2016, 14:36 | ||||||||
|
Можно в классе издателе определить несколько событий и вызывать каждое в зависимости от ситуации. Или лучше оформлять события через EventHandler(object sender, EventArgs e) и передавать, что нужно, в EventArgs e. Например можно подписаться на события нескольких экземпляров сервера, и при каждом событии на сервере, параметры вызвавшего сервера будут передаваться в событие через аргументы.
0
|
||||||||
|
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
|
|
| 28.01.2016, 15:09 | |
|
kolorotur, хм.. выходит и название тоже относится к сигнатуре
не знал. Ассоциировал всегда сигнатуру с неким шаблоном метода
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 28.01.2016, 15:18 | ||
![]() Сигнатура метода — это то, что позволяет однозначно отличить один метод от другого.
0
|
||
|
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
|
|||||||||||
| 28.01.2016, 15:19 [ТС] | |||||||||||
|
Я вот чего еще не понимаю..
Допустим есть такой делегат, принимающий string в качестве параметра
0
|
|||||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 28.01.2016, 15:31 | ||
|
0
|
||
|
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
|
|
| 28.01.2016, 15:33 [ТС] | |
|
А смысл тогда в делегате, если мы сами назначаем какой метод ему запускать
Нельзя напрямую разве?
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 28.01.2016, 15:35 | ||
|
А смысл в том, что сегодня мы знаем, а завтра мы уже не знаем. Когда разработчик кнопки Button писал этот класс, знал ли он, какой метод вы захотите вызывать при клике на кнопку? Подозреваю, что не знал, потому предоставил вам делегат Click в виде события, которому вы можете передать ссылку на нужный вам метод, вызывающийся при клике на кнопку.
0
|
||
|
TheGreatCornholio
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
|
| 28.01.2016, 18:16 | |
|
Glitch, чтобы понять, просто считай, что событие - это обертка над списком делегатов.
+= добавит в список экземпляр делегата, -= удалит. А при возникновении события, все добавленные экземпляры просто вызываются.
1
|
|
|
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
|
||
| 28.01.2016, 18:55 [ТС] | ||
|
Теперь возник следующий вопрос: Почему возникает ошибка когда я помещаю сам делегат в класс с событием?
0
|
||
|
TheGreatCornholio
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
|
| 28.01.2016, 18:58 | |
|
0
|
|
|
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
|
||||||
| 28.01.2016, 19:03 [ТС] | ||||||
Несогласованность по доступности: доступность типа события "MyEvent.MyEventHandler" ниже доступности события "MyEvent.SomeEvent" Не удалось найти тип или имя пространства имен "MyEventHandler" (возможно, отсутствует директива using или ссылка на сборку).
0
|
||||||
|
TheGreatCornholio
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
||
| 28.01.2016, 19:10 | ||
|
1
|
||
|
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
|
||
| 28.01.2016, 19:11 [ТС] | ||
|
(вопрос не по теме) Как на сайте часовой пояс сменить? А то у меня GMT+4 вместо 2
0
|
||
|
TheGreatCornholio
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
|
| 28.01.2016, 19:14 | |
|
0
|
|
| 28.01.2016, 19:14 | |
|
Помогаю со студенческими работами здесь
20
Что такое eclipse и зачем оно нужно?
OpenVZ, VMware® ESXi 64-bit - для чего оно нужно? Правильно ли составлено выражение, и для чего оно нужно в данном коде? Для чего нужно событие Form_QueryUnload Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Автозаполнение реквизита Организации (тип Справочник. Организации):
Если НЕ. . .
|
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
На примере нетипового документа разработанного в конфигурации КА2.
В качестве источника данных указан регистр накопления, в который записываются данные о. . .
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
|
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|