Что такое делегат кратко

Делегаты и события в C#

Перевод статьи подготовлен специально для студентов курса «Разработчик С#».

Что такое делегат кратко. Смотреть фото Что такое делегат кратко. Смотреть картинку Что такое делегат кратко. Картинка про Что такое делегат кратко. Фото Что такое делегат кратко

Что такое события в C#?

Понимание делегатов в C#

В C# делегаты образуют основные строительные блоки для событий. Делегат — это тип, который определяет сигнатуру метода. Например, в C++ это можно сделать с помощью указателя на функцию. В C# вы можете создать экземпляр делегата, указывающий на другой метод. Вы можете вызвать этот метод через экземпляр делегата.

Ниже приведен пример объявления делегата и вызова метода через него.

Использование делегата в C#

Как видите, мы используем ключевое слово delegate, чтобы сообщить компилятору, что мы создаем тип делегата.

Инстанцировать делегаты легко вместе с автоматическим созданием нового типа делегата.

Для создания делегата вы также можете использовать ключевое слово new.

MathDelegate mathDelegate = new MathDelegate(Add) ;

Инстанцированный делегат является объектом; Вы можете также использовать его и передавать в качестве аргумента другим методам.

Многоадресные делегаты в C#

Например, чтобы узнать, сколько методов будет вызывать многоадресный делегат, вы можете использовать следующий код:

Ковариантность и контравариантность в C#

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

Ковариация в делегатах

Вот пример ковариации,

Контравариантность в делегатах

Ниже приведен пример контравариантности.

Вы можете узнать больше об этой концепции здесь.

Лямбда-выражения в C#

Иногда вся сигнатура метода может требовать больше кода, чем само тело метода. Существуют также ситуации, в которых вам нужно создать целый метод только для того, чтобы использовать его в делегате.

Для этих случаев Microsoft добавила некоторые новые возможности в C#, например, анонимные методы в 2.0. В C# 3.0 дела стали обстоять еще лучше, когда были добавлены лямбда-выражения. Лямбда-выражение является предпочтительным способом при написании нового кода.

Ниже приведен пример новейшего лямбда-синтаксиса.

Для чтения этого кода вам нужно использовать слово “следует” в контексте специального лямбда-синтаксиса. Например, первое лямбда-выражение в вышеприведенном примере читается как «x и y следуют к сложению x и y».

Лямбда-функция не имеет конкретного имени в отличии от метода. Из-за этого лямбды называются анонимными функциями. Вам также не нужно явно указывать тип возвращаемого значения. Компилятор предполагает его автоматически из вашей лямбды. И в случае вышеприведенного примера типы параметров x и y также не указаны явно.

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

Типы Func можно найти в пространстве имен System. Они представляют делегаты, которые возвращают тип и принимают от 0 до 16 параметров. Все эти типы наследуются от System.MulticaseDelegate для того, чтобы вы могли добавить несколько методов в список вызовов.

Если вам нужен тип делегата, который не возвращает значение, вы можете использовать типы System.Action. Они также могут принимать от 0 до 16 параметров, но не возвращают значение.

Вот пример использования типа Action,

Все усложняется, когда ваша лямбда-функция начинает ссылаться на переменные, объявленные вне лямбда-выражения или на this. Обычно, когда элемент управления покидает область действия переменной, переменная становится недействительной. Но что, если делегат ссылается на локальную переменную. Чтобы исправить это, компилятор генерирует код, который продлевает срок службы захваченной переменной, по крайней мере, до тех пор, пока живет самый долгоживущий делегат. Это называется замыканием.

Вы можете узнать больше о замыканиях здесь.

События в C#

Рассмотрим популярный шаблон разработки — издатель-подписчик (pub/sub). Вы можете подписаться на событие, а затем вы будете уведомлены, когда издатель события инициирует новое событие. Эта система используется для установления слабой связи между компонентами в приложении.

Делегат формирует основу для системы событий в C#.

Затем метод в другом классе может подписаться на событие, добавив один из его методов в делегат события:

Ниже приведен пример, показывающий, как класс может предоставить открытый делегат и генерировать событие.

Он не позволяет использовать = (прямое назначение делегата). Следовательно, ваш код теперь защищен от риска удаления предыдущих подписчиков, используя = вместо +=.

Кроме того, вы могли заметить специальный синтаксис инициализации поля OnChange для пустого делегата, такого как delegate < >. Это гарантирует, что наше поле OnChange никогда не будет null. Следовательно, мы можем удалить null-проверку перед тем, как вызвать событие, если нет других членов класса, делающих его null.

Когда вы запускаете вышеуказанную программу, ваш код создает новый экземпляр Pub, подписывается на событие двумя разными методами и генерирует событие, вызывая p.Raise. Класс Pub совершенно не осведомлен ни об одном из подписчиков. Он просто генерирует событие.

Вы также можете прочитать мою статью «Шаблон проектирования издатель-подписчик в C#» для более глубокого понимания этой концепции.

Что ж, на этом пока это все. Надеюсь, вы уловили идею. Спасибо за прочтение поста. Пожалуйста, дайте мне знать, если есть какие-либо ошибки или необходимы изменения в комментарии ниже. Заранее спасибо!

Источник

ДЕЛЕГАТ

Смотреть что такое «ДЕЛЕГАТ» в других словарях:

ДЕЛЕГАТ — (этим. см. предыд. сл.). 1) прелат, который, под контролем римского правительства, заведует всеми административными делами делегации, кроме церковных. 2) то же, что депутат, уполномоченный. Словарь иностранных слов, вошедших в состав русского… … Словарь иностранных слов русского языка

делегат — См … Словарь синонимов

Делегат — (программирование) Делегат представитель какой либо организации … Википедия

Делегат — лицо, на которое переводится долг в результате делегации (перевода долга). См. также: Делегации Финансовый словарь Финам … Финансовый словарь

Делегат — Делегат: зарегистрированный участник конференции, съезда, конгресса, собрания, практикума, семинара или симпозиума. Примечание Делегат может классифицироваться как иностранный или отечественный в зависимости от адреса, определяющего его… … Официальная терминология

делегат — Зарегистрированный участник конференции, съезда, конгресса, собрания, практикума, семинара или симпозиума. Примечание Делегат может классифицироваться как «иностранный» или «отечественный» в зависимости от адреса,… … Справочник технического переводчика

ДЕЛЕГАТ — (от лат. delegatus посланный) выборный или назначенный представитель, уполномоченный государства, организации, коллектива. В законодательстве РФ термин Т. употребляется чаще всего для обозначения участников съездов (конференций), общественных… … Юридический словарь

ДЕЛЕГАТ — ДЕЛЕГАТ, делегата, муж. (лат. delegatus). Выборный представитель, уполномоченный каким нибудь коллективом. Делегаты съезда. Толковый словарь Ушакова. Д.Н. Ушаков. 1935 1940 … Толковый словарь Ушакова

ДЕЛЕГАТ — ДЕЛЕГАТ, а, муж. Выборный или назначенный представитель, уполномоченный какой н. организацией. Д. конференции. | жен. делегатка, и (разг.). | прил. делегатский, ая, ое. Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949 1992 … Толковый словарь Ожегова

Делегат — (от лат. delegatus посланный, посланец; англ. delegate) 1) выборный или назначенный представитель, уполномоченный государства, организации, коллектива; 2) в римском праве сторона сделки, называвшейся «делегацией» … Энциклопедия права

Источник

Делегаты, события и лямбды

Делегаты

Определение делегатов

Делегат Message в качестве возвращаемого типа имеет тип void (то есть ничего не возвращает) и не принимает никаких параметров. Это значит, что этот делегат может указывать на любой метод, который не принимает никаких параметров и ничего не возвращает.

Рассмотрим примение этого делегата:

Здесь сначала мы определяем делегат:

В данном случае делегат определяется внутри класса, но также можно определить делегат вне класса внутри пространства имен.

Для использования делегата объявляется переменная этого делегата:

С помощью свойства DateTime.Now.Hour получаем текущий час. И в зависимости от времени в делегат передается адрес определенного метода. Обратите внимание, что методы эти имеют то же возвращаемое значение и тот же набор параметров (в данном случае отсутствие параметров), что и делегат.

Затем через делегат вызываем метод, на который ссылается данный делегат:

Вызов делегата производится подобно вызову метода.

Посмотрим на примере другого делегата:

В данном случае делегат Operation возвращает значение типа int и имеет два параметра типа int. Поэтому этому делегату соответствует любой метод, который возвращает значение типа int и принимает два параметра типа int. В данном случае это методы Add и Multiply. То есть мы можем присвоить переменной делегата любой из этих методов и вызывать.

Делегаты необязательно могут указывать только на методы, которые определены в том же классе, где определена переменная делегата. Это могут быть также методы из других классов и структур.

Присвоение ссылки на метод

Оба способа равноценны.

Соответствие методов делегату

Этому делегату соответствует, например, следующий метод:

А следующие методы НЕ соответствуют:

Здесь метод SomeMethod2 имеет другой возвращаемый тип, отличный от типа делегата. SomeMethod3 имеет другой набор параметров. Параметры SomeMethod4 и SomeMethod5 также отличаются от параметров делегата, поскольку имеют модификаторы ref и out.

Добавление методов в делегат

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

При удалении методов из делегата фактически будет создаватья новый делегат, который в списке вызова методов будет содержать на один метод меньше.

Объединение делегатов

Делегаты можно объединять в другие делегаты. Например:

В данном случае объект mes3 представляет объединение делегатов mes1 и mes2. Объединение делегатов значит, что в список вызова делегата mes3 попадут все методы из делегатов mes1 и mes2. И при вызове делегата mes3 все эти методы одновременно будут вызваны.

Вызов делегата

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

Другой способ вызова делегата представляет метод Invoke() :

Если делегат принимает параметры, то в метод Invoke передаются значения для этих параметров.

Следует учитывать, что если делегат пуст, то есть в его списке вызова нет ссылок ни на один из методов (то есть делегат равен Null), то при вызове такого делегата мы получим исключение, как, например, в следующем случае:

Поэтому при вызове делегата всегда лучше проверять, не равен ли он null. Либо можно использовать метод Invoke и оператор условного null:

Если делегат возвращает некоторое значение, то возвращается значение последнего метода из списка вызова (если в списке вызова несколько методов). Например:

Делегаты как параметры методов

Также делегаты могут быть параметрами методов:

Источник

Делегаты (Руководство по программированию на C#)

Делегат — это тип, который представляет ссылки на методы с определенным списком параметров и типом возвращаемого значения. При создании экземпляра делегата этот экземпляр можно связать с любым методом с совместимой сигнатурой и типом возвращаемого значения. Метод можно вызвать (активировать) с помощью экземпляра делегата.

Делегаты используются для передачи методов в качестве аргументов к другим методам. Обработчики событий — это ничто иное, как методы, вызываемые с помощью делегатов. При создании пользовательского метода класс (например, элемент управления Windows) может вызывать этот метод при появлении определенного события. В следующем примере показано объявление делегата:

Делегату можно назначить любой метод из любого доступного класса или структуры, соответствующей типу делегата. Этот метод должен быть статическим методом или методом экземпляра. Такая гибкость позволяет программно изменять вызовы метода, а также включать новый код в существующие классы.

В контексте перегрузки метода его сигнатура не содержит возвращаемое значение. Однако в контексте делегатов сигнатура метода содержит возвращаемое значение. Другими словами, метод должен иметь тот же возвращаемый тип, что и делегат.

Благодаря возможности ссылаться на метод как на параметр делегаты идеально подходят для определения методов обратного вызова. Можно написать метод, сравнивающий два объекта в приложении. Этот метод можно использовать в делегате для алгоритма сортировки. Поскольку код сравнения отделен от библиотеки, метод сортировки может быть более общим.

В C# 9 для похожих сценариев, где требуется больший контроль над соглашением о вызовах, были добавлены указатели на функции. Код, связанный с делегатом, вызывается с помощью виртуального метода, добавленного к типу делегата. Используя указатели функций, можно указать другие соглашения.

Общие сведения о делегатах

Делегаты имеют следующие свойства.

В этом разделе

Спецификация языка C#

Дополнительные сведения см. в разделе Делегаты в Спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

Источник

Значение слова «делегат»

Что такое делегат кратко. Смотреть фото Что такое делегат кратко. Смотреть картинку Что такое делегат кратко. Картинка про Что такое делегат кратко. Фото Что такое делегат кратко

[От лат. delegatus — посланный]

Источник (печатная версия): Словарь русского языка: В 4-х т. / РАН, Ин-т лингвистич. исследований; Под ред. А. П. Евгеньевой. — 4-е изд., стер. — М.: Рус. яз.; Полиграфресурсы, 1999; (электронная версия): Фундаментальная электронная библиотека

ДЕЛЕГА’Т, а, м. [латин. delegatus]. Выборный представитель, уполномоченный каким-н. коллективом. Делегаты съезда.

Источник: «Толковый словарь русского языка» под редакцией Д. Н. Ушакова (1935-1940); (электронная версия): Фундаментальная электронная библиотека

делега́т

1. выборный или назначенный представитель какой-либо организации, учреждения, коллектива, участвующий в работе какого-либо собрания, конференции и т. п.

Делаем Карту слов лучше вместе

Что такое делегат кратко. Смотреть фото Что такое делегат кратко. Смотреть картинку Что такое делегат кратко. Картинка про Что такое делегат кратко. Фото Что такое делегат краткоПривет! Меня зовут Лампобот, я компьютерная программа, которая помогает делать Карту слов. Я отлично умею считать, но пока плохо понимаю, как устроен ваш мир. Помоги мне разобраться!

Спасибо! Я обязательно научусь отличать широко распространённые слова от узкоспециальных.

Насколько понятно значение слова лучковый (прилагательное):

Ассоциации к слову «делегат&raquo

Синонимы к слову «делегат&raquo

Предложения со словом «делегат&raquo

Цитаты из русской классики со словом «делегат»

Сочетаемость слова «делегат&raquo

Каким бывает «делегат»

Понятия, связанные со словом «делегат»

Отправить комментарий

Дополнительно

Предложения со словом «делегат&raquo

Ещё большая доля профессиональных, партийных работников была в составе российских делегатов съезда.

Большинство делегатов предпочли занять нейтральную позицию, и съезд не принял никакого решения.

Впервые было обнародовано, что 151 делегат конференции представляет 80 тысяч членов партии.

Синонимы к слову «делегат&raquo

Ассоциации к слову «делегат&raquo

Сочетаемость слова «делегат&raquo

Каким бывает «делегат»

Морфология

Правописание

Карта слов и выражений русского языка

Онлайн-тезаурус с возможностью поиска ассоциаций, синонимов, контекстных связей и примеров предложений к словам и выражениям русского языка.

Справочная информация по склонению имён существительных и прилагательных, спряжению глаголов, а также морфемному строению слов.

Сайт оснащён мощной системой поиска с поддержкой русской морфологии.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *