2009-09-01 2 views
3

Можно создать дубликат:
What is the difference between a delegate and events?разные делегат использует

Можно создать дубликат:
Difference between events and delegates and its respective applications

(скопированный из this duplicate)

Когда я должен приподнять п событие я это сделать

public delegate void LogUserActivity(Guid orderGUID); 
public event LogUserActivity ActivityLog; 

даже это работает

public delegate void LogUserActivity(Guid orderGUID); 
public LogUserActivity ActivityLog; 

В чем разница между двумя из них

ответ

3

Есть три вещи здесь:

  • Объявление делегата типа
  • Создание общественной переменной типа делегата
  • Создание общественного событие типа делегата

Переменная - это просто нормальная ва - любой может читать из него, назначать ему и т. д. Событие предоставляет только возможности подписки/отписки для внешнего мира. A Полевое событие, как вы показали здесь, эффективно имеет поведение «по-умолчанию» для подписки/отмены подписки, хранящееся в поле с тем же именем. В объявлении класса вы получаете доступ к полю; вне доступа к событию.

У меня есть article about events и делегаты, которые объясняют более подробно.

EDIT: Для того, чтобы ответить на комментарий, вы можете легко инициализировать поле типа события с «не-оп» обработчик:

public event LogUserActivity ActivityLog = delegate{}; 
+0

jon - когда мне нужно вызвать ActivityLog(), я сначала проверяю, является ли он нулевым или нет. Есть ли способ назначить значение по умолчанию ActivityLog, чтобы оно никогда не было нулевым. – Rohit

+0

@Rohit: Отредактировано для ответа на комментарий. –

1

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

public event LogUserActivity ActivityLog 
{ 
    add { ... } 
    remove { ... } 
} 

Действительно, ваше мероприятие не может иметь делегат поддерживает его на всех, так же, как свойство может не обязательно иметь поле, поддерживающее его.

1

События и общественные делегаты различаются в одном большом пути, который держит меня от использования общественных делегатов в большинстве случаев:

Событие: obj.ActivityLog = null; // недействительный

Публичный делегат: obj.ActivityLog = null; // valid

Это важно, потому что я хочу, чтобы в большинстве случаев абонент добавлял/удалял себя из списка. Я не хочу, чтобы другие объекты отключали события от других подписчиков.

В тех случаях, когда делегат меньше события и больше обратного вызова, я предпочитаю использовать публичные методы, чтобы сделать это и сохранить общественный делегат от воздействия непосредственно:

obj.RegisterActivityCallback (...)

0

в первом случае вы можете назначить несколько слушателей к вашему событию ActivityLog как в:

logger.ActivityLog += new LogUserActivity(Listener1); 
logger.ActivityLog += new LogUserActivity(Listener2); 

Оба метода (Listener1 и Listener2) будет вызываться, когда событие. Во втором случае вы не создаете событие, а делегат. В этом случае вы можете назначить только один слушатель:

logger.ActivityLog = new LogUserActivity(Listener1); 

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

0

, чтобы добавить ко всем предыдущим ответам. Событие IS является делегатом определенного типа. Делегат - это тип, который призван действовать как «умный» указатель на функцию или, иначе говоря, как интеллектуальный «обертку» для указателя функции, который позволяет компилятору разумно решать во время компиляции, является ли функция (s), которые вы вставляете в делегат, согласуются с используемыми вами функциями делегата (согласованность основана на сигнатуре функции).

Событие представляет собой делегат с определенной подписью, в частности, тот, который ничего не возвращает (возвращает void), и принимает два параметра - объект System.object для хранения ссылки на любой объект, инициирующий событие, и экземпляр какого-либо типа, полученного из System.EventArgs, для хранения любых других данных, которые событие должно переносить с него из initialtor в обработчик.

Смежные вопросы