2017-02-09 7 views
0

У меня есть два события в классеВ чем разница между этими двумя объявлениями о событиях?

public event AcquiredDataEvent OnNewAcquiredData; 
public delegate void AcquiredDataEvent(int[] newData); 

public ScanStartedEvent ScanStarted; 
public delegate void ScanStartedEvent(); 

Я просто понял, что ScanStarted не имеет ключевое слово event перед ним. Скорее всего, результат опечатки для меня, хотя он все еще работает так, как ожидалось.

В чем разница между двумя событиями, если они есть?

ответ

1
  1. ScanStarted не является событием. Это всего лишь поле типа делегата.
  2. Он может вызываться вне класса, где поле отклонено.
  3. Он не предоставляет методы добавления/удаления (это то, что такое событие, как свойство - это пара методов get/set) для прикрепления/удаления обработчиков событий - вы можете просто назначить нового делегата ScanStarted.

КСТАТИ Так же, как вы можете иметь свойство без поддержки поля

public int Value 
{ 
    get { return 42; } 
    set { Console.WriteLine($"Haha, keep {value} for yourself"); } 
} 

Вы можете иметь событие без поля делегата под капотом

public event AcquiredDataEvent OnNewAcquiredData 
{ 
    add { Console.WriteLine("Trying to attach some handlers?"); } 
    remove { Console.WriteLine("Haha, you should attach something first!"); } 
} 
+0

Хм, я должен смотреть на это. Спасибо. – KDecker

+0

@KDecker самый важный момент - событие добавляет вам безопасность. Вы не можете просто вызвать его как 'obj.ScanStarted()' или присвоить ему значение 'obj.ScanStarted = YourNewAndOnlyHandler' –