С делегат: С# и .NET | Делегаты
Общие сведения о делегатах | Microsoft Docs
-
- Чтение занимает 2 мин
-
В этой статье
Делегаты предоставляют механизм позднего связывания в .NET.Delegates provide a late binding mechanism in .NET. Позднее связывание означает, что создается алгоритм, где вызывающий объект также предоставляет по крайней мере один метод, который реализует часть алгоритма.Late Binding means that you create an algorithm where the caller also supplies at least one method that implements part of the algorithm.
Например, рассмотрим сортировку списка звезд в астрономическом приложении.For example, consider sorting a list of stars in an astronomy application.
Можно отсортировать звезды по расстоянию от Земли, по величине или по воспринимаемой яркости.You may choose to sort those stars by their distance from the earth, or the magnitude of the star, or their perceived brightness.
Во всех этих случаях метод Sort() выполняет, по сути, одно и то же: упорядочивает элементы в списке на основе некоего сравнения.In all those cases, the Sort() method does essentially the same thing: arranges the items in the list based on some comparison. Для каждого порядка сортировки используется разный код, сравнивающий две звезды.The code that compares two stars is different for each of the sort orderings.
Такого рода решения использовались в программном обеспечении в течение полувека.These kinds of solutions have been used in software for half a century.
Концепция использования делегатов в языке C# обеспечивает первоклассную поддержку языка и безопасность типов.The C# language delegate concept provides first class language support, and type safety around the concept.
Как вы увидите далее в этой серии статей, код C#, создаваемый для подобных алгоритмов, является строго типизированным и использует язык и компилятор для соответствия типов аргументам и возвращаемым типам.As you’ll see later in this series, the C# code you write for algorithms like this is type safe, and leverages the language and the compiler to ensure that the types match for arguments and return types.
Цели разработки языка для делегатовLanguage Design Goals for Delegates
Разработчики, использующие язык, определили несколько целей для функций, которые в итоге стали делегатами.The language designers enumerated several goals for the feature that eventually became delegates.
Группе разработчиков требовалась общая языковая конструкция, которую можно было бы использовать для любых алгоритмов позднего связывания.The team wanted a common language construct that could be used for any late binding algorithms. Разработчикам удалось изучить одну концепцию и применить ее для решения многих самых разных проблем программного обеспечения.That enables developers to learn one concept, and use that same concept across many different software problems.
Во-вторых, команде нужна поддержка одиночных и многоадресных вызовов методов.Second, the team wanted to support both single and multicast method calls. (Многоадресные делегаты — это делегаты, которые объединяют в цепочку несколько вызовов методов.(Multicast delegates are delegates that chain together multiple method calls.
Вы увидите примеры далее в этой серии.)You’ll see examples later in this series.)
Группа разработчиков хотела, чтобы делегаты поддерживали ту же безопасность типа, ожидаемую от всех конструкций C#.The team wanted delegates to support the same type safety that developers expect from all C# constructs.
И, наконец, группа пришла к выводу, что шаблон событий является определенным шаблоном, где использование делегатов (или любого алгоритма позднего связывания) очень эффективно.Finally, the team recognized that an event pattern is one specific pattern where delegates, or any late binding algorithm, is very useful. Группе разработчиков требовалось, чтобы код для делегатов служил основой для шаблона событий .NET.The team wanted to ensure that the code for delegates could provide the basis for the .NET event pattern.
Результатом всей этой работы стала поддержка делегатов и событий в C# и .NET.The result of all that work was the delegate and event support in C# and .NET. В оставшихся статьях в этом разделе будут рассматриваться возможности языка, поддержка библиотек и стандартные практики, которые применяются при работе с делегатами.The remaining articles in this section will cover the language features, the library support, and the common idioms that are used when you work with delegates.
Вы узнаете о ключевом слове delegate
и коде, который он создает.You’ll learn about the delegate
keyword and what code it generates. Вы узнаете о функциях в классе System.Delegate
и их использовании.You’ll learn about the features in the System.Delegate
class, and how those features are used. Вы научитесь создавать типобезопасные делегаты и ознакомитесь со способами создания методов, которые можно вызывать с помощью делегатов.You’ll learn how to create type safe delegates, and how to create methods that can be invoked through delegates. Вы также узнаете, как работать с делегатами и событиями с помощью лямбда-выражения.You’ll also learn how to work with delegates and events by using Lambda expressions. Вы увидите, каким образом делегаты становятся одними из стандартных блоков для LINQ.You’ll see where delegates become one of the building blocks for LINQ. Вы узнаете, что делегаты являются основой для шаблона событий .NET, и определите их отличия.You’ll learn how delegates are the basis for the .NET event pattern, and how they are different.
В целом вы получите представление о том, что делегаты являются неотъемлемой частью программирования в .NET и работы с API платформы.Overall, you’ll see how delegates are an integral part of programming in .NET and working with the framework APIs.
Приступим.Let’s get started.
ВпередNext
Делегаты и события | Microsoft Docs
-
- Чтение занимает 3 мин
-
В этой статье
НазадPrevious
Разработчики, не имеющие опыта работы с платформой .NET Core, часто не могут решить, что следует выбрать: структуру на основе delegates
или на основе events
.Developers that are new to the .NET Core platform often struggle when deciding between a design based on delegates
and a design based on events
. Часто выбор делегатов или событий довольно сложен, так как эти две возможности языка довольно похожи.The choice of delegates or events is often difficult, because the two language features are similar. Более того, события основаны на тех же средствах языка, которые обеспечивают поддержку делегатов.Events are even built using the language support for delegates.
И те и другие обеспечивают сценарии позднего связывания, в которых взаимодействие компонента осуществляется путем вызова метода, известного только во время выполнения.They both offer a late binding scenario: they enable scenarios where a component communicates by calling a method that is only known at runtime. И те и другие поддерживают методы с одним или несколькими подписчиками.They both support single and multiple subscriber methods. Иногда это называют поддержкой одноадресности и многоадресности.You may find this referred to as singlecast and multicast support. Синтаксис добавления и удаления обработчиков в обоих случаях похож.They both support similar syntax for adding and removing handlers. Наконец, при вызове событий и делегатов используется абсолютно одинаковый синтаксис вызова методов.Finally, raising an event and calling a delegate use exactly the same method call syntax. Более того, поддерживается одинаковый синтаксис метода Invoke()
для использования с оператором ?.
.They even both support the same Invoke()
method syntax for use with the ?.
operator.
Учитывая такое сходство, легко могут возникнуть проблемы с выбором подходящего механизма в той или иной ситуации.With all those similarities, it is easy to have trouble determining when to use which.
Прослушивание событий необязательноListening to Events is Optional
Самым важным фактором при выборе подходящего механизма является обязательность наличия подключенного подписчика.The most important consideration in determining which language feature to use is whether or not there must be an attached subscriber. Если ваш код должен вызывать код, предоставленный подписчиком, следует использовать структуру на основе делегатов, когда вам нужно реализовать обратный вызов.If your code must call the code supplied by the subscriber, you should use a design based on delegates when you need to implement callback. Если код может выполнить все задачи, не вызывая подписчики, следует использовать структуру на основе событий.If your code can complete all its work without calling any subscribers, you should use a design based on events.
Обратите внимание на примеры, рассматривавшиеся в этом разделе.Consider the examples built during this section. Код, который вы создавали с помощью List.Sort()
, должен содержать функцию сравнения для правильной сортировки элементов.The code you built using List.Sort()
must be given a comparer function in order to properly sort the elements. Запросам LINQ необходимо предоставить делегаты для определения элементов, которые следует вернуть.LINQ queries must be supplied with delegates in order to determine what elements to return. В обоих случаях использовалась структура на основе делегатов.Both used a design built with delegates.
Рассмотрим событие Progress
.Consider the Progress
event. Оно сообщает о ходе выполнения задачи.It reports progress on a task.
Задача продолжает выполняться вне зависимости от того, есть ли прослушиватели.The task continues to proceed whether or not there are any listeners.
Еще один пример — FileSearcher
.The FileSearcher
is another example. Нахождение всех искомых файлов производится, даже если не подключены обработчики событий.It would still search and find all the files that were sought, even with no event subscribers attached.
Элементы управления UX продолжают работать правильно, даже если нет подписчиков, прослушивающих события.UX controls still work correctly, even when there are no subscribers listening to the events. В обоих примерах используются структуры на основе событий.They both use designs based on events.
Для возвращаемых значений требуются делегатыReturn Values Require Delegates
Еще одним аспектом является прототип метода, который требуется для метода делегата.Another consideration is the method prototype you would want for your delegate method. Как вы уже видели, все делегаты, используемые для событий, имеют тип возвращаемого значения void.As you’ve seen, the delegates used for events all have a void return type. Вы уже также знаете, что есть идиомы для создания обработчиков событий, которые передают информацию обратно источникам событий, изменяя свойства объекта аргумента события.You’ve also seen that there are idioms to create event handlers that do pass information back to event sources through modifying properties of the event argument object. Хотя такие идиомы работают, они не так естественны, как возвращение значения из метода.While these idioms do work, they are not as natural as returning a value from a method.
Обратите внимание, что часто присутствуют оба исследуемых аспекта. Если метод делегата возвращает значение, скорее всего, это повлияет на алгоритм.Notice that these two heuristics may often both be present: If your delegate method returns a value, it will likely impact the algorithm in some way.
Для событий используется закрытый вызовEvents Have Private Invocation
Классы, отличные от тех, в которых содержится событие, могут только добавлять и удалять прослушиватели событий. Вызывать событие может только класс, содержащий событие.Classes other than the one in which an event is contained can only add and remove event listeners; only the class containing the event can invoke the event. События обычно являются открытыми членами класса.Events are typically public class members.
Для сравнения, делегаты часто передаются как параметры и хранятся как закрытые члены класса (если хранятся вообще).By comparison, delegates are often passed as parameters and stored as private class members, if they are stored at all.
Прослушиватели событий часто имеют более длительный срок существованияEvent Listeners Often Have Longer Lifetimes
То, что прослушиватели событий имеют более продолжительное время существования, — не столь важный фактор.That event listeners have longer lifetimes is a slightly weaker justification. Однако структура на основе событий может оказаться более естественной, когда источник событий инициирует события в течение длительного периода времени.However, you may find that event-based designs are more natural when the event source will be raising events over a long period of time. Примеры структуры на основе событий для элементов управления UX можно найти во многих системах.You can see examples of event-based design for UX controls on many systems. После подписания на событие источник события может вызывать события в течение всего времени существования программы.Once you subscribe to an event, the event source may raise events throughout the lifetime of the program.
(Когда события больше не нужны, вы можете отменить подписку на них.)(You can unsubscribe from events when you no longer need them.)
Сравните это с часто встречающимися структурами на основе делегатов, когда делегат применяется в качестве аргумента метода и не используется после того, как метод возвращает управление.Contrast that with many delegate-based designs, where a delegate is used as an argument to a method, and the delegate is not used after that method returns.
Тщательно оценивайте ситуациюEvaluate Carefully
Приведенные выше указания не являются строгими правилами.The above considerations are not hard and fast rules. Они представляют собой лишь рекомендации, которые могут помочь вам выбрать правильный вариант в конкретном случае.Instead, they represent guidance that can help you decide which choice is best for your particular usage. Так как эти механизмы схожи, вы можете смоделировать и тот и другой, чтобы проверить, какой из них окажется естественнее.Because they are similar, you can even prototype both, and consider which would be more natural to work with. Оба они хорошо подходят для сценариев с поздним связыванием.They both handle late binding scenarios well. Используйте тот механизм, который лучше соответствует вашим требованиям.Use the one that communicates your design the best.
ДЕЛЕГАТ — это… Что такое ДЕЛЕГАТ?
ДЕЛЕГАТ — (этим. см. предыд. сл.). 1) прелат, который, под контролем римского правительства, заведует всеми административными делами делегации, кроме церковных. 2) то же, что депутат, уполномоченный. Словарь иностранных слов, вошедших в состав русского… … Словарь иностранных слов русского языка
делегат — См … Словарь синонимов
Делегат — (программирование) Делегат представитель какой либо организации … Википедия
Делегат — лицо, на которое переводится долг в результате делегации (перевода долга). См. также: Делегации Финансовый словарь Финам … Финансовый словарь
Делегат — Делегат: зарегистрированный участник конференции, съезда, конгресса, собрания, практикума, семинара или симпозиума. Примечание Делегат может классифицироваться как иностранный или отечественный в зависимости от адреса, определяющего его… … Официальная терминология
делегат — Зарегистрированный участник конференции, съезда, конгресса, собрания, практикума, семинара или симпозиума. Примечание Делегат может классифицироваться как «иностранный» или «отечественный» в зависимости от адреса,… … Справочник технического переводчика
ДЕЛЕГАТ — (от лат. delegatus посланный) выборный или назначенный представитель, уполномоченный государства, организации, коллектива. В законодательстве РФ термин Т. употребляется чаще всего для обозначения участников съездов (конференций), общественных… … Юридический словарь
ДЕЛЕГАТ — ДЕЛЕГАТ, делегата, муж. (лат. delegatus). Выборный представитель, уполномоченный каким нибудь коллективом. Делегаты съезда. Толковый словарь Ушакова. Д.Н. Ушаков. 1935 1940 … Толковый словарь Ушакова
ДЕЛЕГАТ — ДЕЛЕГАТ, а, муж. Выборный или назначенный представитель, уполномоченный какой н. организацией. Д. конференции. | жен. делегатка, и (разг.). | прил. делегатский, ая, ое. Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949 1992 … Толковый словарь Ожегова
Делегат — (от лат. delegatus посланный, посланец; англ. delegate) 1) выборный или назначенный представитель, уполномоченный государства, организации, коллектива; 2) в римском праве сторона сделки, называвшейся «делегацией» … Энциклопедия права
Делегат — это… Что такое Делегат?
ДЕЛЕГАТ — (этим. см. предыд. сл.). 1) прелат, который, под контролем римского правительства, заведует всеми административными делами делегации, кроме церковных. 2) то же, что депутат, уполномоченный. Словарь иностранных слов, вошедших в состав русского… … Словарь иностранных слов русского языка
делегат — См … Словарь синонимов
Делегат — лицо, на которое переводится долг в результате делегации (перевода долга). См. также: Делегации Финансовый словарь Финам … Финансовый словарь
ДЕЛЕГАТ — (delegate) Лицо, которому индивид или группа предоставляют право действовать от своего имени. Основная идея делегирования состоит в том, что доверитель (тот, что делегирует) передает право или ответственность лицу, делегируемому выполнять… … Политология. Словарь.
Делегат — Делегат: зарегистрированный участник конференции, съезда, конгресса, собрания, практикума, семинара или симпозиума. Примечание Делегат может классифицироваться как иностранный или отечественный в зависимости от адреса, определяющего его… … Официальная терминология
делегат — Зарегистрированный участник конференции, съезда, конгресса, собрания, практикума, семинара или симпозиума. Примечание Делегат может классифицироваться как «иностранный» или «отечественный» в зависимости от адреса,… … Справочник технического переводчика
ДЕЛЕГАТ — (от лат. delegatus посланный) выборный или назначенный представитель, уполномоченный государства, организации, коллектива. В законодательстве РФ термин Т. употребляется чаще всего для обозначения участников съездов (конференций), общественных… … Юридический словарь
ДЕЛЕГАТ — ДЕЛЕГАТ, делегата, муж. (лат. delegatus). Выборный представитель, уполномоченный каким нибудь коллективом. Делегаты съезда. Толковый словарь Ушакова. Д.Н. Ушаков. 1935 1940 … Толковый словарь Ушакова
ДЕЛЕГАТ — ДЕЛЕГАТ, а, муж. Выборный или назначенный представитель, уполномоченный какой н. организацией. Д. конференции. | жен. делегатка, и (разг.). | прил. делегатский, ая, ое. Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949 1992 … Толковый словарь Ожегова
Делегат — (от лат. delegatus посланный, посланец; англ. delegate) 1) выборный или назначенный представитель, уполномоченный государства, организации, коллектива; 2) в римском праве сторона сделки, называвшейся «делегацией» … Энциклопедия права
делегат — Викисловарь
Морфологические и синтаксические свойства
падеж | ед. ч. | мн. ч. |
---|---|---|
Им. | делега́т | делега́ты |
Р. | делега́та | делега́тов |
Д. | делега́ту | делега́там |
В. | делега́та | делега́тов |
Тв. | делега́том | делега́тами |
Пр. | делега́те | делега́тах |
де-ле-га́т
Существительное, одушевлённое, мужской род, 2-е склонение (тип склонения 1a по классификации А. А. Зализняка).
Корень: -делег-; суффикс: -ат [Тихонов, 1996].
Произношение
Семантические свойства
Значение
- выборный или назначенный представитель какой-либо организации, учреждения, коллектива, участвующий в работе какого-либо собрания, конференции и т. п. ◆ Отсутствует пример употребления (см. рекомендации).
Синонимы
- частичн.: депутат
Антонимы
Гиперонимы
Гипонимы
Родственные слова
Этимология
Происходит от лат. delegatus «посланный», прич. прош. от delegare «направлять, отправлять», далее из de- (выражает отделение, устранение, отсутствие чего-либо или завершение действия) + legare «возлагать, поручать», далее из lex (род. п. legis) «закон». Русск. делегат заимств. через польск. delegat. Использованы данные словаря М. Фасмера. См. Список литературы.
Фразеологизмы и устойчивые сочетания
Перевод
Библиография
ДЕЛЕГАТ — это… Что такое ДЕЛЕГАТ?
ДЕЛЕГАТ — (этим. см. предыд. сл.). 1) прелат, который, под контролем римского правительства, заведует всеми административными делами делегации, кроме церковных. 2) то же, что депутат, уполномоченный. Словарь иностранных слов, вошедших в состав русского… … Словарь иностранных слов русского языка
делегат — См … Словарь синонимов
Делегат — (программирование) Делегат представитель какой либо организации … Википедия
Делегат — лицо, на которое переводится долг в результате делегации (перевода долга). См. также: Делегации Финансовый словарь Финам … Финансовый словарь
ДЕЛЕГАТ — (delegate) Лицо, которому индивид или группа предоставляют право действовать от своего имени. Основная идея делегирования состоит в том, что доверитель (тот, что делегирует) передает право или ответственность лицу, делегируемому выполнять… … Политология. Словарь.
Делегат — Делегат: зарегистрированный участник конференции, съезда, конгресса, собрания, практикума, семинара или симпозиума. Примечание Делегат может классифицироваться как иностранный или отечественный в зависимости от адреса, определяющего его… … Официальная терминология
делегат — Зарегистрированный участник конференции, съезда, конгресса, собрания, практикума, семинара или симпозиума. Примечание Делегат может классифицироваться как «иностранный» или «отечественный» в зависимости от адреса,… … Справочник технического переводчика
ДЕЛЕГАТ — ДЕЛЕГАТ, делегата, муж. (лат. delegatus). Выборный представитель, уполномоченный каким нибудь коллективом. Делегаты съезда. Толковый словарь Ушакова. Д.Н. Ушаков. 1935 1940 … Толковый словарь Ушакова
ДЕЛЕГАТ — ДЕЛЕГАТ, а, муж. Выборный или назначенный представитель, уполномоченный какой н. организацией. Д. конференции. | жен. делегатка, и (разг.). | прил. делегатский, ая, ое. Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949 1992 … Толковый словарь Ожегова
Делегат — (от лат. delegatus посланный, посланец; англ. delegate) 1) выборный или назначенный представитель, уполномоченный государства, организации, коллектива; 2) в римском праве сторона сделки, называвшейся «делегацией» … Энциклопедия права
c # — Локальные переменные с делегатами
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
- Авторизоваться
зарегистрироваться текущее сообщество
.
C # делегатов
- Подписывайтесь на нас
- Питон
- ASP.NET Core
- MVC
- IoC
- Веб-API
- C #
- TypeScript
- Node.js
- Больше
✕
. Учебники .NET
- ASP.NET Core
- ASP.NET MVC
- IoC
- веб-API
- C #
- LINQ
Учебники по скриптам
- TypeScript
- AngularJS 1
- Узел.js
- D3.js
- jQuery
- JavaScript
Другие учебные пособия
- Python
- Sass
- Https
Тесты навыков
- ASP.NET Core
- ASP.NET MVC
- LINQ
- C #
- веб-API
- IoC
- TypeScript
- AngularJS
- Node.js
- jQuery
- JavaScript
- Статьи
- Тесты
- Напишите нам
- Учебники по C #
- C # — Начало работы
- C # — История версий
- C # — Первая программа
- C # — Ключевые слова
- C # — Класс
- C # — переменная
- C # — неявно типизированная переменная
- C # — Типы данных
- Числа
- Струны
- DateTime
- C # — Типы значений и ссылок
- C # — анонимный тип
- C # — динамические типы
- C # — Интерфейс
- C # — Операторы
- C # — операторы if else
- C # — Тернарный оператор?:
- C # — переключатель
- C # — цикл For
- C # — цикл пока
- C # — цикл Do-while
- C # — Структура
- C # — Enum
- C # — StringBuilder
- C # — частичный класс
- C # — статический
- C # — Массив
- Многомерный массив
- Зубчатый массив
- C # — Индексатор
- C # — Дженерики
- Общие ограничения
- C # — Коллекции
- ArrayList
- Список
- SortedList
- Словарь
- Хеш-таблица
- Стек
- Очередь
- C # — Кортеж
- C # — ValueTuple
- C # — встроенные исключения
- Исключение
.
c # — Почему делегат создается с помощью `Delegate.CreateDelegate` быстрее, чем делегаты лямбда-выражения и метода?
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
.