|
Как работают события, возвращающие значения?
|
|||
---|---|---|---|
#18+
Создаю класс TaskBar, это что-то вроде панели задач Windows, только в MDI-приложении. Создала делегат Код: c# 1.
И событие Код: c# 1.
обработчик этого события в родительской (MDI) форме (ниже) вызывается, когда пользователь на TaskBar'е жмёт кнопку "Создать новое окно": Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Вызов обработчика в самом TaskBar'е (по нажатию на кнопку "создать новое окно") Код: c# 1.
эту форму я уже кидаю в массив, значок там рисую на TaskBar'е и т.д. Ещё один факт: Если никто не подпишется на NewFormCreated, то по нажатию на кнопку "создать новое окно" выдастся ошибка в последней строке из приведённых, и это нормальная реакция. Вопрос: Как будет работать код "Form form = NewFormCreated ...", если на событие подпишется сразу несколько обработчиков. Адрес какой формы будет занесён в переменную form? Можно ли как-то отловить все возвращаемые значения? А то каждый обработчик свою форму создаст и..куда она денется? Переменная-то всего одна. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2015, 13:07 |
|
Как работают события, возвращающие значения?
|
|||
---|---|---|---|
#18+
у меня опечатка, в третьем блоке нужно было Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2015, 13:08 |
|
Как работают события, возвращающие значения?
|
|||
---|---|---|---|
#18+
Nika gnomeАдрес какой формы будет занесён в переменную form? Последней. Nika gnomeЕсли никто не подпишется на NewFormCreated, то по нажатию на кнопку "создать новое окно" выдастся ошибка в последней строке из приведённых, и это нормальная реакция. Надо проверять значение NewFormCreated на null. Если событие только для UI-потока, можно и напрямую, иначе сохранять NewFormCreated в локальную переменную, которую проверять на null и вызывать событие через эту переменную. P. S. А вообще не рекомендую использовать возвращаемые значения в событиях - лучше сохраняйте их в свойства аргументов события EventArgNewForm. Там можно сделать свойство типа данных коллекции и сохранять сразу несколько значений. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2015, 13:14 |
|
Как работают события, возвращающие значения?
|
|||
---|---|---|---|
#18+
Nika gnome Вопрос: Как будет работать код "Form form = NewFormCreated ...", если на событие подпишется сразу несколько обработчиков. Адрес какой формы будет занесён в переменную form? Можно ли как-то отловить все возвращаемые значения? А то каждый обработчик свою форму создаст и..куда она денется? Переменная-то всего одна. При вызове события результатом будет результат последнего отработавшего обработчика (последнего в invocation list), остальные результаты уйдут в никуда - т.е. будут подобраны GC. Нюанс в том, что в общем случае порядок расположения обработчиков в invocation list события недетерминирован - он отдан на откуп реализации, и если сейчас он строго совпадает с порядком навешивания обработчиков на событие в коде, то нет никаких гарантий, что в будущих релизах платформы будет так же. Поэтому на порядок вызова обработчиков полагаться не следует. За вычетом этого нюанса ничего страшного в событиях, возвращающих значение, не вижу. Как пример: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2015, 13:53 |
|
Как работают события, возвращающие значения?
|
|||
---|---|---|---|
#18+
Ilya81Nika gnomeАдрес какой формы будет занесён в переменную form? Последней. Возможно ли как-то сделать ограничение, чтобы программа выдавала ошибку в случае, если на это событие подпишутся двое? (если нет, то, видимо, буду использовать делегат напрямую, без события) Либо как-то узнать все возвращаемые значения, или это невозможно? Ilya81Надо проверять значение NewFormCreated на null. В общем случае, да. Но в моём пусть выдаёт ошибку, т.к. такое недопустимо. В общем случае, опять же, если null, то выдавать самописный exception. В моём это не принципиально. Если выдаст ошибку, значит, я накосячила и забыла подписаться.. Ilya81А вообще не рекомендую использовать возвращаемые значения в событиях Понимаю. Но от того, кто будет пользоваться моим компонентом я требую, чтобы он записал результат, не забыл это сделать. Самый очевидный способ - через return. А так, да, можно и через out, и вашим способом в сочетании с проверкой (if(e.form == null) throw myexception) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2015, 13:54 |
|
Как работают события, возвращающие значения?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, спасибо за комментарий)) да, на порядок не надеюсь, т.к. он не описан в документации... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2015, 13:56 |
|
Как работают события, возвращающие значения?
|
|||
---|---|---|---|
#18+
Nika gnomeВозможно ли как-то сделать ограничение, чтобы программа выдавала ошибку в случае, если на это событие подпишутся двое? (если нет, то, видимо, буду использовать делегат напрямую, без события) Через явную реализацию события: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Nika gnomeЛибо как-то узнать все возвращаемые значения, или это невозможно? Через возвращаемое значение, скорее, не получится, разве что наворотив какую-то особую явную реализацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2015, 14:04 |
|
|
start [/forum/topic.php?fid=20&msg=38860591&tid=1401994]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 343ms |
total: | 479ms |
0 / 0 |