Программирование

понедельник, 3 марта 2014 г.

Сравнение: event vs delegate

И делегаты, и события позволяют реализовать шаблон проектирования Наблюдатель. В чём же различие? Если в одном предложении, то событие — это надстройка на делегатом, которая сильно урезает его "в правах".
  1. Событие нельзя объявить свойством, только полем. Однако событие поддерживает определение своих методов подписки и отписки (add и remove) в стиле свойств.
  2. Реализация подписки и отписки на событие потокобезопасна (речь идёт о штатных методах add и remove).
  3. Полю события нельзя присвоить null вне другого класса. Вообще, стороннему коду нельзя ничего сделать с полем события кроме как подписаться или отписаться. Для этого используются операторы += и -=, которые транслируются в вызов add и remove. Оператор = к событиям не применим.
  4. Запускать событие напрямую можно только в том классе, в котором оно объявлено. Даже в потомках нельзя. Однако это можно сделать через метод-обёртку.
По мотивам топика на Хабре.