c# — С#: события или интерфейс наблюдателя? За и против?
Рассмотрим событие как интерфейс обратного вызова, где интерфейс имеет только один метод.
Использовать только нужные вам события
С событиями вам нужно всего лишь реализовать обработчики для событий, которые вам интересны в обработке. В шаблоне интерфейса наблюдателя вам необходимо реализовать все методы во всем интерфейсе, в том числе внедрить тела методов для типов уведомлений, которые вам действительно не нужны. В вашем примере вам всегда нужно реализовывать OnFoundDirectory и OnFoundFile, даже если вам нужно только одно из этих событий.
Меньше обслуживания
Еще одна хорошая вещь о событиях — вы можете добавить новый в конкретный класс, чтобы он поднимет его, и вам не нужно менять каждого существующего наблюдателя. Если вы хотите добавить новый метод в интерфейс, вам нужно обойти все классы, которые уже реализуют этот интерфейс и внедряют новый метод во всех них. Однако с событием вам нужно только изменить существующие классы, которые на самом деле хотят что-то сделать в ответ на новое событие, которое вы добавляете.
Шаблон встроен в язык, чтобы все знали, как его использовать
События идиоматичны, потому что когда вы видите событие, вы знаете, как его использовать. С интерфейсом наблюдателя люди часто реализуют различные способы регистрации для получения уведомлений и подключения наблюдателя.. с событиями, хотя, как только вы научитесь регистрировать и использовать один (с оператором + =), остальные — все то же самое.
Преимущества для интерфейсов
У меня не так много преимуществ для интерфейсов. Я предполагаю, что они заставляют кого-то внедрять все методы в интерфейсе. Но вы не можете заставить кого-то правильно реализовать все эти методы, поэтому я не думаю, что в этом есть большая ценность.
Синтаксис
Некоторым людям не нравится, как вы должны объявлять тип делегата для каждого события. Кроме того, стандартные обработчики событий в инфраструктуре .Net имеют следующие параметры: (отправитель объекта, аргументы EventArgs). Поскольку отправитель не указывает конкретный тип, вы должны использовать его, если хотите его использовать. Это часто бывает на практике, если вы чувствуете себя не совсем правильно, потому что теряете защиту системы статического типа. Но, если вы реализуете свои собственные события и не следуете рамочному соглашению .Net, вы можете использовать правильный тип, поэтому потенциальный нисходящий кастинг не требуется.
qaru.site
События (Руководство по программированию в C#)
- Время чтения: 2 мин
В этой статье
События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций. Класс, отправляющий (или вызывающий) событие, называется издателем, а классы, принимающие (или обрабатывающие) событие, называются подписчиками.
В C# в стандартном приложении Windows Forms или веб-приложении пользователь подписывается на события, вызываемые элементами управления, такими как кнопки и поля со списками. Для просмотра событий, публикуемых элементом управления, и выбора некоторых из них для обработки можно воспользоваться средой IDE Visual C#. IDE автоматически добавит пустой метод обработчика событий и код, необходимый для подписки на событие. Дополнительные сведения см. в разделе Практическое руководство. Подписка и отмена подписки на события (Руководство по программированию в C#).
Общие сведения о событиях
События имеют следующие свойства.
Издатель определяет момент вызова события, подписчики определяют предпринятое ответное действие.
У события может быть несколько подписчиков. Подписчик может обрабатывать несколько событий от нескольких издателей.
События, не имеющие подписчиков, никогда не возникают.
Обычно события используются для оповещения о действиях пользователя, таких как нажатия кнопок или выбор меню и их пунктов в графическом пользовательском интерфейсе.
Если событие имеет несколько подписчиков, то при его возникновении происходит синхронный вызов обработчиков событий. Сведения об асинхронном вызове событий см. в разделе Асинхронный вызов синхронных методов.
В библиотеке классов .NET Framework в основе событий лежит делегат EventHandler и базовый класс EventArgs.
Связанные разделы
Дополнительные сведения см. в следующих разделах.
Спецификация языка C#
Дополнительные сведения см. в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
Главы в популярных книгах
Delegates, Events, and Lambda Expressions в книге C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers
Delegates and Events в книге Learning C# 3.0: Master the fundamentals of C# 3.0
См. также
Ссылки
Делегаты (Руководство по программированию на C#)
EventHandler
Основные понятия
Руководство по программированию на C#
Другие ресурсы
Создание обработчиков событий в Windows Forms
Многопоточное программирование с использованием асинхронной модели, основанной на событиях
msdn.microsoft.com
События (Руководство по программированию в C#)
- Время чтения: 3 мин
- Соавторы
В этой статье
События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций.Events enable a class or object to notify other classes or objects when something of interest occurs. Класс, отправляющий (или порождающий) событие, называется издателем , а классы, принимающие (или обрабатывающие) событие, называются подписчиками.The class that sends (or raises) the event is called the publisher and the classes that receive (or handle) the event are called subscribers.
В типичном веб-приложении или приложении Windows Forms C# вы подписываетесь на события, вызываемые элементами управления, такими как кнопки и списки.In a typical C# Windows Forms or Web application, you subscribe to events raised by controls such as buttons and list boxes. Вы можете использовать интегрированную среду разработки (IDE) Visual C#, чтобы просмотреть события, публикуемые элементом управления, и выбрать те из них, которые необходимо обрабатывать.You can use the Visual C# integrated development environment (IDE) to browse the events that a control publishes and select the ones that you want to handle. IDE автоматически добавляет пустой метод обработчика событий и код для подписки на событие.The IDE automatically adds an empty event handler method and the code to subscribe to the event. Дополнительные сведения см. в разделе Практическое руководство. Подписка и отмена подписки на события.For more information, see How to: Subscribe to and Unsubscribe from Events.
Общие сведения о событияхEvents Overview
События имеют следующие свойства:Events have the following properties:
Издатель определяет, когда возникает событие; подписчики определяют, какое действие выполняется в ответ на событие.The publisher determines when an event is raised; the subscribers determine what action is taken in response to the event.
У события может быть несколько подписчиков.An event can have multiple subscribers. Подписчик может обрабатывать несколько событий от нескольких издателей.A subscriber can handle multiple events from multiple publishers.
События, не имеющие подписчиков, никогда не возникают.Events that have no subscribers are never raised.
Обычно события используются для оповещения о действиях пользователя, например нажатиях кнопок или выборе пунктов меню в графических пользовательских интерфейсах.Events are typically used to signal user actions such as button clicks or menu selections in graphical user interfaces.
Если событие имеет несколько подписчиков, при возникновении события обработчики событий вызываются синхронно.When an event has multiple subscribers, the event handlers are invoked synchronously when an event is raised. Сведения об асинхронном вызове событий см. в разделе Calling Synchronous Methods Asynchronously.To invoke events asynchronously, see Calling Synchronous Methods Asynchronously.
В библиотеке классов .NET Framework.NET Framework события основываются на делегате EventHandler и базовом классе EventArgs .In the .NET Framework.NET Framework class library, events are based on the EventHandler delegate and the EventArgs base class.
Дополнительные сведения:For more information, see:
Спецификация языка C#C# Language Specification
Дополнительные сведения см. в разделе События в Спецификации языка C#.For more information, see Events in the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.
Главы в популярных книгахFeatured Book Chapters
Делегаты, события и лямбда-выражения в справочном руководстве по C# 3.0, третье издание: более 250 решений для программистов на C# 3.0Delegates, Events, and Lambda Expressions in C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers
Делегаты и события в статье Изучение C# 3.0: овладение основными понятиями C# 3.0Delegates and Events in Learning C# 3.0: Master the fundamentals of C# 3.0
См. такжеSee Also
docs.microsoft.com
c# — событие Действие против события EventHandler
Основываясь на некоторых предыдущих ответах, я собираюсь разбить свой ответ на три области.
Во-первых, физические ограничения использования Action<T1, T2, T2... >
vs с использованием производного класса EventArgs
. Есть три: во-первых, если вы измените число или типы параметров, каждый метод, который подписывается, должен быть изменен, чтобы соответствовать новому шаблону. Если это публичное событие, которое будут использовать сторонние сборки, и есть вероятность, что переменные событий будут меняться, это может послужить основанием для использования пользовательского класса, полученного из аргументов событий для согласованности (помните, что вы ДОЛЖНЫ используйте
). Во-вторых, использование Action<T1, T2, T2... >
не позволит вам передать обратную связь BACK к вызывающему методу, если у вас нет какого-либо объекта (например, с использованием свойства Handled), который передается вместе с действием. В-третьих, вы не получаете именованных параметров, поэтому, если вы передаете 3 bool
a int
, два string
и a DateTime
, вы не знаете, что означает эти значения. В качестве побочного примечания вы все равно можете безопасно использовать «Огонь этого события» при использовании Action<T1, T2, T2... >
«.
Во-вторых, последствия последовательности. Если у вас есть большая система, с которой вы уже работаете, почти всегда лучше следить за тем, как разрабатывается остальная часть системы, если у вас не очень хорошая причина. Если вы публично сталкиваетесь с событиями, которые необходимо поддерживать, возможность замены производных классов может быть важна. Помните об этом.
В-третьих, реальная практика жизни, я лично считаю, что я, как правило, создаю много событий для вещей, таких как изменения свойств, с которыми мне нужно взаимодействовать (особенно при работе с MVVM с моделями просмотра, которые взаимодействуют друг с другом) или где событие имеет один параметр. Большую часть времени эти события принимают форму public event Action<[classtype], bool> [PropertyName]Changed;
или public event Action SomethingHappened;
. В этих случаях есть два преимущества. Во-первых, я получаю тип для класса выдачи. Если MyClass
объявляет и является единственным классом, запускающим событие, я получаю явный экземпляр MyClass
для работы с обработчиком события. Во-вторых, для простых событий, таких как события изменения свойств, значение параметров очевидно и указано в имени обработчика событий, и мне не нужно создавать множество классов для этих событий.
qaru.site