|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
Туплю. Вот объект в виде поля класса Код: c# 1.
вот назначаю обработчик обработчик в конструкторе этого класса Код: c# 1.
потом где-то в коде обновляют поле этого класса Код: c# 1.
Что произёйдёт с children_CollectionChanged? Он уже не будет работать? Ведь старый объект сhildren уже скормлен сборщику мусора. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 11:06 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
Конечно не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 11:12 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
AntonariyКонечно не будет. Значит, если я хочу, чтобы к новому объекту children всегда был привязан этот обработчик, мне надо везде, где происходит присвоение нового children, добавлять подписку на этот обработчик. Так? Скажем, в сеттере, да? Ну и тогда завести правило, что даже если внутри самого класса присваивается новый children, то это должно делаться через свойство. А то я иногда внутри класса работаю прямо с полями, а вот в таком сценарии это недопустимо. Так? Извините, что туплю - я в последнее время что-то не уверен даже в элементарных вещах. Их элеметарность подкупает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 12:52 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320Ну и тогда завести правило, что даже если внутри самого класса присваивается новый children, то это должно делаться через свойство. А то я иногда внутри класса работаю прямо с полями, а вот в таком сценарии это недопустимо. Так?Так. И отписаться от старого значения не помешает. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 12:59 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
Не совсем понял суть проблемы. Если она в том, чтобы привязка обработчиков не терялась вместе с объектом (типа обработчиков произвольно много и заранее неизвестно сколько), то можно завести переменную, в которой все это хранить: Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 13:01 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
AntonariyНе совсем понял суть проблемы. Если она в том, чтобы привязка обработчиков не терялась вместе с объектом (типа обработчиков произвольно много и заранее неизвестно сколько), то можно завести переменную, в которой все это хранить: Код: c# 1. 2. 3. 4. 5.
Хмм, тоже вариант. А делегат (это же делегат?) много места в памяти занимает? Ну, т. е. такие операции не накладны? Алексей Кuser7320Ну и тогда завести правило, что даже если внутри самого класса присваивается новый children, то это должно делаться через свойство. А то я иногда внутри класса работаю прямо с полями, а вот в таком сценарии это недопустимо. Так?Так. И отписаться от старого значения не помешает. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Да, и ещё проверка value на равенство текущему значению, чтобы обработчики лишний раз не гонять туда-сюда. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 13:09 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320А делегат (это же делегат?) много места в памяти занимает?Копьище, это же ссылки на адреса в памяти, по которым разместились обработчики. А делегат ли это, я х.з. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 13:15 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320Значит, если я хочу, чтобы к новому объекту children всегда был привязан этот обработчик, мне надо везде, где происходит присвоение нового children, добавлять подписку на этот обработчик. Так? Скажем, в сеттере, да? Вместо этого Код: c# 1.
сделай Код: c# 1.
и не будет тебе геморроя ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 13:23 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
Pallarisuser7320Значит, если я хочу, чтобы к новому объекту children всегда был привязан этот обработчик, мне надо везде, где происходит присвоение нового children, добавлять подписку на этот обработчик. Так? Скажем, в сеттере, да? Вместо этого Код: c# 1.
сделай Код: c# 1.
и не будет тебе геморроя Да, это тоже вариант. Просто у меня разные сценарии могут быть - может быть не Код: c# 1.
а прилетать конкретная заполненная коллеция. Тогда придётся её элементы копировать. Вобщем, главное, я узнал про обработчики. И получил некоторые варианты работы в разных сценариях. Всем спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 13:46 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
Продолжим тему. Значит, решил я воспользоваться советом Антонария и вынести делегат в отдельное поле. Это мне нужно было в т. ч. и для того, чтобы воспользоваться сериализацией. Делаю так. Класс Quest помечен атрибутом Serializable и в нём есть поля Код: c# 1. 2.
В конструторе класса делаю так Код: c# 1. 2. 3. 4.
Затем сериализую и десериализую Код: c# 1.
Всё, что делает DeepClone(), это Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Затем добавляю в коллецию потомков объекта quest один объект Код: c# 1.
И метод Children_CollectionChanged НЕ ВЫЗЫВАЕТСЯ. Почему? Я же его сериализовал. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 16:28 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320Затем добавляю в коллецию потомков объекта quest один объект Код: c# 1.
Вместо model надо quest. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 16:29 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
Главное, под дебагом показывает, что этот метод в делегате объекта quest есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 16:30 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320Главное, под дебагом показывает, что этот метод в делегате объекта quest есть. А, понял. В делегате объекта quest он есть, а в делегате quest._children.CollectionChanged его нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 16:33 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
Пля, ну его нах, этот DeepClone. Получается, что надо кастомный метод глубокого копирования делать - одних сериализаций недостаточно. И в этом кастомном методе надо создавать новый объект Quest, который будет копировать все поля и, главное, добавлять обработчики в делегаты нужных коллекций . Сама сериализация это сделать не может. Жопа, короче... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 16:35 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
ох уж эта игроиндустрия!! ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 16:54 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320Пля, ну его нах, этот DeepClone. Получается, что надо кастомный метод глубокого копирования делать - одних сериализаций недостаточно. И в этом кастомном методе надо создавать новый объект Quest, который будет копировать все поля и, главное, добавлять обработчики в делегаты нужных коллекций . Сама сериализация это сделать не может. Жопа, короче... Вроде, десериализация использует дефолтный конструктор для восстановления объекта? Я затолкал подписку на событие в дефолтный конструктор и ничего - всё равно у коллеции скопированного (десериализованного) объекта нет такой же подписки. Кроме того, при десериализации дебаггер не останавливается на дефолтном конструкторе, хотя там точка останова стоит. Почему так? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 16:55 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
Pallarisох уж эта игроиндустрия!! Потом, поди, спиратишь у меня, да? А я сделаю клиент-серверную и с донатом - главбосса не убьёшь без доната и разлочки супермеча (+100 к атаке, + 50 к силе). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 16:57 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320Pallarisох уж эта игроиндустрия!! Потом, поди, спиратишь у меня, да?Не на erlang-е, не на Closure И даже не на Rx. Пиратить не интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 17:09 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
skyANAuser7320пропущено... Потом, поди, спиратишь у меня, да?Не на erlang-е, не на Closure И даже не на Rx. Пиратить не интересно. А какие ты игры знаешь на Эрланге или там... ну, из тех, что ты перечислил? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 17:21 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320, да полно так называемых Social Games на Erlang. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 17:24 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
skyANAuser7320, да полно так называемых Social Games на Erlang. Т. е. никаких там крузисов и бэтлфидлов? Сдаётся мне, что игры на эрланге это как сайты, имитирующие десптоп-приложения на джаваскрипте. И всё же, ПОЧЕМУ ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 19:01 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320skyANAuser7320, да полно так называемых Social Games на Erlang. Т. е. никаких там крузисов и бэтлфидлов? Сдаётся мне, что игры на эрланге это как сайты, имитирующие десптоп-приложения на джаваскрипте.Сдаётся мне, что ты не в теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 19:03 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320И всё же, ПОЧЕМУ ? Постарайтесь ответить для себя на несколько вопросов и сопоставить между собой ответы: 1. для чего нужна сериализация? 2. что такое делегат функции на самом деле? Получив ответы и сопоставив их, Вы придёте к пониманию того, ПОЧЕМУ не получается десериализовать то, что Вы хотите. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 19:19 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
Alex Kuznetsovuser7320И всё же, ПОЧЕМУ ? Постарайтесь ответить для себя на несколько вопросов и сопоставить между собой ответы: 1. для чего нужна сериализация? 2. что такое делегат функции на самом деле? Получив ответы и сопоставив их, Вы придёте к пониманию того, ПОЧЕМУ не получается десериализовать то, что Вы хотите. 1. Сериализация нужна, чтобы превратить объект одного формата в другой. Например, C#-объект в XML. 2. Делегат - это указатель на функцию, в терминах С++. Только в Сишарпе ещё навернули сверху, типа мультикаст-делегатов (а других в Сишарпе и нет, вроде), которые могут коллецию методов выполнять. Вроде, в С++ такого нет. По крайней мере, я в 2001 году не встречал. А я всё равно ХОЧУ!.. Хочу клонировать объекты и чтобы обработчики им тоже назначались. Получается, что тут лучше использовать свой специальный метод клонирования в классе, чем сериализацией пытаться это сделать? Я тут почитал http://developerscon.blogspot.ru/2008/06/c-object-clone-wars.html Пришёл к выводу, что, если отбросить все методы поверхностного копирования, то всё сводится либо к написанию своих методов, которые будут каждое поле копировать, либо с сериализации, с которой надо заморачиваться с атрибутами. Но, как я выше сказал, с делегатами у сериализации проблемы. Тогда остаются только кастомные методы? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 19:50 |
|
Обработчики события привязан к объекту?
|
|||
---|---|---|---|
#18+
user7320, Всё верно. Сериализация в том числе нужна и для передачи состояния объекта в том случае когда программа останавливается и запускается вновь, равно как и для передачи состояния объекта между разными процессами. Делегат - это адрес начала функции в runtime в рамках конкретного процесса. Теперь сопоставив эти два факта мы приходим к выводу, что сериализация (т.е. сохранение) адреса начала функции смысла не имеет, т.к. у разных процессов могут быть разные адреса функций во время исполнения. Отсюда вывод - использовать свою реализацию десериализации, либо присваивать делегат объекту после его десериализации. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2014, 20:37 |
|
|
start [/forum/topic.php?fid=20&msg=38638948&tid=1402945]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
93ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 347ms |
total: | 543ms |
0 / 0 |