powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Обработчики события привязан к объекту?
25 сообщений из 25, страница 1 из 1
Обработчики события привязан к объекту?
    #38638456
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Туплю.

Вот объект в виде поля класса

Код: c#
1.
ObservableCollection<Quest> сhildren;



вот назначаю обработчик обработчик в конструкторе этого класса

Код: c#
1.
children.CollectionChanged += children_CollectionChanged;



потом где-то в коде обновляют поле этого класса

Код: c#
1.
сhildren = new ObservableCollection<Quest>();



Что произёйдёт с children_CollectionChanged? Он уже не будет работать? Ведь старый объект сhildren уже скормлен сборщику мусора.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638472
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно не будет.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638622
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyКонечно не будет.
Значит, если я хочу, чтобы к новому объекту children всегда был привязан этот обработчик, мне надо везде, где происходит присвоение нового children, добавлять подписку на этот обработчик. Так? Скажем, в сеттере, да?

Ну и тогда завести правило, что даже если внутри самого класса присваивается новый children, то это должно делаться через свойство. А то я иногда внутри класса работаю прямо с полями, а вот в таком сценарии это недопустимо.

Так?

Извините, что туплю - я в последнее время что-то не уверен даже в элементарных вещах. Их элеметарность подкупает.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638637
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Ну и тогда завести правило, что даже если внутри самого класса присваивается новый children, то это должно делаться через свойство. А то я иногда внутри класса работаю прямо с полями, а вот в таком сценарии это недопустимо.

Так?Так. И отписаться от старого значения не помешает.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public ObservableCollection<Item> Children
{
    get { return _children; }
    set
    {
        if (_children != null)
            _children.CollectionChanged -= children_CollectionChanged;

        _children = value;

        if (_children != null)
            _children.CollectionChanged += children_CollectionChanged;
    }
}

ObservableCollection<Item> _children;
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638639
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понял суть проблемы. Если она в том, чтобы привязка обработчиков не терялась вместе с объектом (типа обработчиков произвольно много и заранее неизвестно сколько), то можно завести переменную, в которой все это хранить:

Код: c#
1.
2.
3.
4.
5.
varCollectionChanged += children_CollectionChanged;

//после убийства старого и создания нового объекта

children.CollectionChanged = varCollectionChanged;
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638653
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyНе совсем понял суть проблемы. Если она в том, чтобы привязка обработчиков не терялась вместе с объектом (типа обработчиков произвольно много и заранее неизвестно сколько), то можно завести переменную, в которой все это хранить:

Код: c#
1.
2.
3.
4.
5.
varCollectionChanged += children_CollectionChanged;

//после убийства старого и создания нового объекта

children.CollectionChanged = varCollectionChanged;


Хмм, тоже вариант. А делегат (это же делегат?) много места в памяти занимает? Ну, т. е. такие операции не накладны?

Алексей Кuser7320Ну и тогда завести правило, что даже если внутри самого класса присваивается новый children, то это должно делаться через свойство. А то я иногда внутри класса работаю прямо с полями, а вот в таком сценарии это недопустимо.

Так?Так. И отписаться от старого значения не помешает.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public ObservableCollection<Item> Children
{
    get { return _children; }
    set
    {
        if (_children != null)
            _children.CollectionChanged -= children_CollectionChanged;

        _children = value;

        if (_children != null)
            _children.CollectionChanged += children_CollectionChanged;
    }
}

ObservableCollection<Item> _children;


Да, и ещё проверка value на равенство текущему значению, чтобы обработчики лишний раз не гонять туда-сюда.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638664
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320А делегат (это же делегат?) много места в памяти занимает?Копьище, это же ссылки на адреса в памяти, по которым разместились обработчики. А делегат ли это, я х.з.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638675
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Значит, если я хочу, чтобы к новому объекту children всегда был привязан этот обработчик, мне надо везде, где происходит присвоение нового children, добавлять подписку на этот обработчик. Так? Скажем, в сеттере, да?


Вместо этого
Код: c#
1.
сhildren = new ObservableCollection<Quest>();



сделай
Код: c#
1.
сhildren.Clear();



и не будет тебе геморроя
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638709
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisuser7320Значит, если я хочу, чтобы к новому объекту children всегда был привязан этот обработчик, мне надо везде, где происходит присвоение нового children, добавлять подписку на этот обработчик. Так? Скажем, в сеттере, да?


Вместо этого
Код: c#
1.
сhildren = new ObservableCollection<Quest>();



сделай
Код: c#
1.
сhildren.Clear();



и не будет тебе геморроя
Да, это тоже вариант. Просто у меня разные сценарии могут быть - может быть не

Код: c#
1.
сhildren = new ObservableCollection<Quest>();



а прилетать конкретная заполненная коллеция. Тогда придётся её элементы копировать.

Вобщем, главное, я узнал про обработчики. И получил некоторые варианты работы в разных сценариях. Всем спасибо.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638946
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжим тему.

Значит, решил я воспользоваться советом Антонария и вынести делегат в отдельное поле. Это мне нужно было в т. ч. и для того, чтобы воспользоваться сериализацией.

Делаю так.

Класс Quest помечен атрибутом Serializable и в нём есть поля

Код: c#
1.
2.
protected ObservableCollection<Quest> _children;
protected NotifyCollectionChangedEventHandler _children_CollectionChanged;



В конструторе класса делаю так

Код: c#
1.
2.
3.
4.
_children_CollectionChanged = Children_CollectionChanged;

_children = new ObservableCollection<Quest>();
_children.CollectionChanged += _children_CollectionChanged;



Затем сериализую и десериализую

Код: c#
1.
Quest quest = quest.DeepClone();



Всё, что делает DeepClone(), это

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        public static T DeepClone<T>(this T obj)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, obj);
                ms.Position = 0;
                return (T)bf.Deserialize(ms);
            }
        }



Затем добавляю в коллецию потомков объекта quest один объект

Код: c#
1.
model.Children.Add(new Quest());



И метод Children_CollectionChanged НЕ ВЫЗЫВАЕТСЯ. Почему? Я же его сериализовал.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638947
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Затем добавляю в коллецию потомков объекта quest один объект

Код: c#
1.
model.Children.Add(new Quest());


Вместо model надо quest.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638948
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главное, под дебагом показывает, что этот метод в делегате объекта quest есть.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638953
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Главное, под дебагом показывает, что этот метод в делегате объекта quest есть.
А, понял. В делегате объекта quest он есть, а в делегате quest._children.CollectionChanged его нет.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638959
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пля, ну его нах, этот DeepClone. Получается, что надо кастомный метод глубокого копирования делать - одних сериализаций недостаточно. И в этом кастомном методе надо создавать новый объект Quest, который будет копировать все поля и, главное, добавлять обработчики в делегаты нужных коллекций . Сама сериализация это сделать не может. Жопа, короче...
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638980
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ох уж эта игроиндустрия!!
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638985
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Пля, ну его нах, этот DeepClone. Получается, что надо кастомный метод глубокого копирования делать - одних сериализаций недостаточно. И в этом кастомном методе надо создавать новый объект Quest, который будет копировать все поля и, главное, добавлять обработчики в делегаты нужных коллекций . Сама сериализация это сделать не может. Жопа, короче...
Вроде, десериализация использует дефолтный конструктор для восстановления объекта? Я затолкал подписку на событие в дефолтный конструктор и ничего - всё равно у коллеции скопированного (десериализованного) объекта нет такой же подписки. Кроме того, при десериализации дебаггер не останавливается на дефолтном конструкторе, хотя там точка останова стоит. Почему так?
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638987
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisох уж эта игроиндустрия!!
Потом, поди, спиратишь у меня, да? А я сделаю клиент-серверную и с донатом - главбосса не убьёшь без доната и разлочки супермеча (+100 к атаке, + 50 к силе).
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38638996
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Pallarisох уж эта игроиндустрия!!
Потом, поди, спиратишь у меня, да?Не на erlang-е, не на Closure И даже не на Rx. Пиратить не интересно.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38639009
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320пропущено...

Потом, поди, спиратишь у меня, да?Не на erlang-е, не на Closure И даже не на Rx. Пиратить не интересно.
А какие ты игры знаешь на Эрланге или там... ну, из тех, что ты перечислил?
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38639013
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, да полно так называемых Social Games на Erlang.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38639110
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320, да полно так называемых Social Games на Erlang.
Т. е. никаких там крузисов и бэтлфидлов?

Сдаётся мне, что игры на эрланге это как сайты, имитирующие десптоп-приложения на джаваскрипте.

И всё же, ПОЧЕМУ ?
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38639112
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANAuser7320, да полно так называемых Social Games на Erlang.
Т. е. никаких там крузисов и бэтлфидлов?

Сдаётся мне, что игры на эрланге это как сайты, имитирующие десптоп-приложения на джаваскрипте.Сдаётся мне, что ты не в теме.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38639130
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320И всё же, ПОЧЕМУ ?
Постарайтесь ответить для себя на несколько вопросов и сопоставить между собой ответы:
1. для чего нужна сериализация?
2. что такое делегат функции на самом деле?

Получив ответы и сопоставив их, Вы придёте к пониманию того, ПОЧЕМУ не получается десериализовать то, что Вы хотите.
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38639151
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsovuser7320И всё же, ПОЧЕМУ ?
Постарайтесь ответить для себя на несколько вопросов и сопоставить между собой ответы:
1. для чего нужна сериализация?
2. что такое делегат функции на самом деле?

Получив ответы и сопоставив их, Вы придёте к пониманию того, ПОЧЕМУ не получается десериализовать то, что Вы хотите.
1. Сериализация нужна, чтобы превратить объект одного формата в другой. Например, C#-объект в XML.

2. Делегат - это указатель на функцию, в терминах С++. Только в Сишарпе ещё навернули сверху, типа мультикаст-делегатов (а других в Сишарпе и нет, вроде), которые могут коллецию методов выполнять. Вроде, в С++ такого нет. По крайней мере, я в 2001 году не встречал.

А я всё равно ХОЧУ!.. Хочу клонировать объекты и чтобы обработчики им тоже назначались. Получается, что тут лучше использовать свой специальный метод клонирования в классе, чем сериализацией пытаться это сделать?

Я тут почитал http://developerscon.blogspot.ru/2008/06/c-object-clone-wars.html
Пришёл к выводу, что, если отбросить все методы поверхностного копирования, то всё сводится либо к написанию своих методов, которые будут каждое поле копировать, либо с сериализации, с которой надо заморачиваться с атрибутами. Но, как я выше сказал, с делегатами у сериализации проблемы. Тогда остаются только кастомные методы?
...
Рейтинг: 0 / 0
Обработчики события привязан к объекту?
    #38639188
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
Всё верно.
Сериализация в том числе нужна и для передачи состояния объекта в том случае когда программа останавливается и запускается вновь, равно как и для передачи состояния объекта между разными процессами.
Делегат - это адрес начала функции в runtime в рамках конкретного процесса.
Теперь сопоставив эти два факта мы приходим к выводу, что сериализация (т.е. сохранение) адреса начала функции смысла не имеет, т.к. у разных процессов могут быть разные адреса функций во время исполнения.

Отсюда вывод - использовать свою реализацию десериализации, либо присваивать делегат объекту после его десериализации.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Обработчики события привязан к объекту?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]