Различие между событиями и делегатами и его [закрытыми] соответствующими приложениями

Вы написали print с большой буквы P, также лучше использовать return в такой функции, чем печатать в ней.

def celcius(f):
    return (f-32)*5/9

f=int(input("Enter a temperature in Farenheit "))
print celcius(f)

Кроме того, я сделал ваш CamelCase более питоническим. Лучше придерживаться языковых стандартов, особенно если вы новичок.

106
задан halfer 12 May 2013 в 14:39
поделиться

6 ответов

С технической точки зрения другие ответы обратились к различиям.

С точки зрения семантики, события являются действиями, повышенными объектом, когда определенные условия соблюдены. Например, мой класс Stock имеет свойство под названием Предел, и это генерирует событие, когда курсы акций достигают Предела. Это уведомление сделано через событие. Заботится ли кто-либо на самом деле об этом событии и подписывается на него, вне беспокойства класса владельца.

делегат А является большим количеством общего обозначения для описания конструкции, подобной указателю в терминах C/C++. Все делегаты в .NET являются многоадресными делегатами. С точки зрения семантики они обычно используются как своего рода вход. В частности, они - лучший способ реализовать Стратегическая модель . Например, если я хочу отсортировать Список объектов, я могу предоставить стратегию Компаратора методу для сообщения реализации, как сравнить два объекта.

я использовал эти два метода в производственном коде. Тонны моих объектов данных уведомляют, когда определенные свойства встречены. Самый основной пример, каждый раз, когда свойство изменяется, событие PropertyChanged, повышен (см. интерфейс INotifyPropertyChanged). Я использовал делегатов в коде для обеспечения различных стратегий превращения определенных объектов в строку. Этим конкретным примером был прославленный ToString () список реализаций для конкретного типа объекта для отображения его пользователям.

48
ответ дан Szymon Rozga 24 November 2019 в 03:52
поделиться

Ключевое слово event является модификатором объема для многоадресных делегатов. Практические различия между этим и просто объявлением многоадресного делегата следующие:

  • можно использовать event в интерфейсе.
  • доступ Вызова к многоадресному делегату ограничен классом объявления. Поведение состоит в том, как будто делегат был частным за вызов. В целях присвоения доступ столь же указан явным модификатором доступа (например, public event).

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

B = new EventHandler(this.MethodB);
C = new EventHandler(this.MethodC);
A = B + C;

Демонстрационные два, иллюстрируя и прямое присвоение и присвоение комбинации.

B = new EventHandler(this.MethodB);
C = new EventHandler(this.MethodC);
A = B;
A += C;

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

B = new EventHandler(this.MethodB);
C = new EventHandler(this.MethodC);
A = null;
A += B;
A += C;

свойства Like, события имеют полный синтаксис, который никто никогда не использует. Это:

class myExample 
{
  internal EventHandler eh;

  public event EventHandler OnSubmit 
  { 
    add 
    {
      eh = Delegate.Combine(eh, value) as EventHandler;
    }
    remove
    {
      eh = Delegate.Remove(eh, value) as EventHandler;
    }
  }

  ...
}

... делает точно то же как это:

class myExample 
{
  public event EventHandler OnSubmit;
}

добавление и удаляет методы, более заметны в довольно неестественном синтаксисе что использование VB.NET (никакие перегрузки оператора).

54
ответ дан Peter Wone 24 November 2019 в 03:52
поделиться

События являются синтаксическим сахаром. Они восхитительны. Когда я вижу событие, я знаю, что сделать. Когда я вижу делегата, я не так уверен.

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

12
ответ дан Sean 24 November 2019 в 03:52
поделиться

События отмечены как таковые в метаданных. Это позволяет вещам как Windows Forms или разработчики ASP.NET отличать события от простых свойств типа делегата и оказывать соответствующую поддержку для них (конкретно показ их на вкладке Events Окна свойств).

Другое различие от свойства типа делегата - то, что пользователи могут только добавить и удалить обработчики событий, тогда как со свойством делегата вводят, они могут установить значение:

someObj.SomeCallback = MyCallback;  // okay, replaces any existing callback
someObj.SomeEvent = MyHandler;  // not okay, must use += instead

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

5
ответ дан itowlson 24 November 2019 в 03:52
поделиться

Edit#1 , Когда Вы использовали бы делегатов по событиям и vs.versa? Заявите свой опыт реального мира с обоими, скажите в производственном коде.

, Когда я разрабатываю свои собственные API, я определяю делегатов, которые передаются как параметры методам, или конструкторам классов:

  • Так, чтобы метод мог реализовать простой 'шаблонный шаблон' метода (как, например, Predicate и Action делегаты передаются классам универсального набора .NET)
  • Или так, чтобы класс мог сделать 'обратный вызов' (обычно обратный вызов к методу класса, который создал его).

Эти делегаты обычно обязательные во времени выполнения (т.е. не должен быть null).

я склонен не использовать события; но где я действительно использую события, я использую их для [1 114] дополнительно события сигнализации к [1 115] нуль, один, или больше клиенты, которые могли бы быть интересно, т.е. когда он имеет смысл, что класс (например, System.Windows.Form класс) должен существовать и работать, добавил ли какой-либо клиент обработчик событий к его событию (например, 'мышь формы вниз' событие существует, но это дополнительное , интересуется ли любой внешний клиент установкой обработчика событий на то событие).

3
ответ дан ChrisW 24 November 2019 в 03:52
поделиться

Хотя у меня нет технических причин его, я использую события в коде стиля UI, другими словами, в более высоких уровнях кода, и использую делегатов к логике, которая кладет глубже в коде. Поскольку я говорю, что Вы могли использовать также, но я нахожу, что этот шаблон использования является логически звуковым, если ничто иное, он помогает зарегистрировать типы обратных вызовов и их иерархии также.

<час>

Редактирование: Я думаю различие в шаблонах использования, которые я имею, был бы то, что, я нахожу совершенно приемлемым проигнорировать события, они - рычаги/тупики, если необходимо знать о событии, слушать их, если Вы не заботитесь о событии, просто игнорируют его. Вот почему я использую их для UI, kindof стиль события Javascript/Browser. Однако, когда у меня есть делегат, я ожидаю, ДЕЙСТВИТЕЛЬНО ожидают, что кто-то справится с задачей делегата и выдаст исключение если не обработанный.

2
ответ дан Robert Gould 24 November 2019 в 03:52
поделиться
Другие вопросы по тегам:

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