Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > События


Автор: penguin 30.5.2006, 11:37
Есть универсальный класс, который имеет некоторое событие.  Мы подключаемся к этому событию, и семантика предметной области предполагает чтобы именно этот класс отвечал за освобождение всех своих ресурсов, при этом я внутри класса не представляю какие делегаты к его событию подключили!!!! Выход один, не делать с событием ничего при етом я боюсь что объекты могут просто повиснут в памяти, и память под них, не будет освобождена сборщиком мусора, или создавать дополнительные делегаты или что нибудь есче, при етом я получаю усложнение интерфейса класса, что не желательно. Что делать? Зарание спасибо!!!! 

Автор: mr.DUDA 30.5.2006, 12:37
Каждый объект, подписавшийся на событие, должен от него отписаться - тогда ссылок не останется (например, реализовать в классе-подписчике интерфейс IDisposable и в Dispose() отписываться от всех событий, на которые подписан объект). Класс, публикующий событие, не ответствен за отписку обработчиков от события.  

Автор: VisualProgrammerNET 30.5.2006, 16:35
У меня вот такой вопрос. Зачем вообще нужны события? Ведь можно же всё заменить обычными методами и условиями. Типа if (something == 0) DoThis(). Скорее всего, я чего-то недопонимаю... можно какой-нибудь примерчик, где НЕЛЬЗЯ обойтись без события? 

Автор: ivashkanet 30.5.2006, 16:39
Цитата(VisualProgrammerNET @  30.5.2006,  16:35 Найти цитируемый пост)
something == 0

а как ты узнаешь, что something изменилось??? Вот для этого и существуют события 

Автор: VisualProgrammerNET 30.5.2006, 16:48
Ну есть класс, где есть метод, изменяющий something.
Код

void Method()
{
something--;
if (somtehing == 0)
DoThis()
}

voila! 

Автор: ivashkanet 30.5.2006, 16:50
Цитата(VisualProgrammerNET @  30.5.2006,  16:35 Найти цитируемый пост)
Скорее всего, я чего-то недопонимаю...

Очень сильно не допонимаешь.
События вызываются кодом 
Код

EventArgs e = new EventArgs();
OnMouseClick(e);

После этого все подпищики получают сообщение о клике мыши, с аргументами в скобках

Добавлено @ 16:52 
Цитата(VisualProgrammerNET @  30.5.2006,  16:48 Найти цитируемый пост)
voila! 

А как ты узнаешь, что мыша кликнулась? 

Автор: mr.DUDA 30.5.2006, 17:03
VisualProgrammerNET, класс который публикует событие, не знает о том, кто будет обрабатывать это событие. То есть, твой "if" будет в одном месте (у публикующего объекта), а "DoThis" - в другом (у обрабатывающего). Кроме того, на событие можно подписываться и отписываться в рантайме, а твой код - жёстко фиксирован. 

Автор: penguin 30.5.2006, 17:34
Цитата

Каждый объект, подписавшийся на событие, должен от него отписаться - тогда ссылок не останется (например, реализовать в классе-подписчике интерфейс IDisposable и в Dispose() отписываться от всех событий, на которые подписан объект). Класс, публикующий событие, не ответствен за отписку обработчиков от события.   

Ну в принципе понятно. Просто хотелось как по красивее, не вводя дополнительных переменных, придется оставить как было. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)