Вопрос по events, c# – События не поля - я не понимаю

52

ВC # в глубине (отличная книга до сих пор), объясняет Скитevents aren't fields, Я много раз читал этот раздел и не понимаю, почему это различие имеет какое-либо значение.

Я один из тех разработчиков, которые путают события и делегируют экземпляры. На мой взгляд, они одинаковы. Разве это не просто форма косвенного обращения? Мы можем многоадресную передачу обоих. Событие настраивается как поле как сокращение ... конечно. Но мы добавляем или удаляем обработчики. Складывая их, чтобы вызывать, когда происходит событие. Разве мы не делаем то же самое с делегатами, складываем их вместе и вызываем invoke?

Я очень ценю точку зрения каждого высококвалифицированного специалиста. P.Brian.Mackey
Вау; Вы привлекли немало "веса", чтобы ответить на ваш вопрос! ;) Andrew Barber
Обратите внимание, что после того, как я покопался в сообщении об ошибках, я обнаружил, что Джон действительно разъясняет эту тему (просто ссылка, приведенная в книге, неверна): Csharpindepth.com / Статьи / Chapter2 / Events.aspx P.Brian.Mackey

Ваш Ответ

1   ответ
46

Я один из тех разработчиков, которые путают события и делегируют экземпляры. На мой взгляд, они одинаковы.

В голову приходит старая поговорка о том, чтобы не видеть лес за деревьями. Различие, которое я делаю, состоит в том, что события находятся на более высоком «семантическом уровне», чем поле экземпляра делегата. Событие сообщает потребителю тип «привет, я тип, который любит говорить вам, когда что-то происходит». Тип является источником события; это часть его государственного контракта.

Как подробности реализации, этот класс выбирает отслеживать, кто заинтересован в прослушивании этого события, и что и когда сообщать подписчикам о том, что событие происходит, - это дело класса. Обычно это происходит с многоадресным делегатом, но это деталь реализации. Это настолько общая деталь реализации, что разумно путать их, но у нас действительно есть две разные вещи: открытая поверхность и частная деталь реализации.

Аналогично, свойства описывают семантику объекта: у клиента есть имя, поэтому у класса Customer есть свойство Name. Вы можете сказать, что «их имя» является собственностью клиента, но вы никогда не скажете, что «их имя» является Поле клиента; это деталь реализации определенного класса, а не факт о семантике бизнеса. То, что свойство обычно реализуется как поле, является частной деталью механики класса.

Так 1. что этот делегат не может сделать, но события могут (или наоборот) 2. что эти события должны делать, что делегат не должен. Это может очистить еще более кристально чистый. Dhananjay

Похожие вопросы