Для чего нужны делегаты c

Для чего нужны делегаты c

  • Переводы , 8 ноября 2018 в 20:37
  • Corewood

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

«Делегат ссылается на метод и после назначения метода ведёт себя идентично ему. Делегат можно использовать как любую функцию с параметром и возвращаемым значением», — официальная документация MSDN.

Несмотря на то, что .NET использует концепцию функционального указателя посредством делегатов, есть несколько существенных отличий:

  • делегаты нечувствительны к ошибкам ввода;
  • объектно-ориентированы;
  • безопасны.

Делегаты C# обладают следующими свойствами:

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

Синтаксис

Шаг 1 — Объявление

Шаг 2 — Инициализация

Делегат инициализируется путём передачи ему имени метода в качестве аргумента.

Шаг 3 — Вызов

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

Пример 1

Нижеприведённый код складывает между собой два числа:

Выводом будет следующий результат:

Пример 2

Теперь рассмотрим реализацию сортировки «пузырьком» с помощью делегатов. Для этого мы создадим несколько классов:

BubbleSortClass.cs

Этот класс будет содержать статическую функцию Sort() , у которой нет возвращаемого значения. В качестве аргумента она принимает массив, который будет отсортирован путём сравнивания пар элементов.

Student.cs

Объект этого класса и будет использован для сортировки.

Program.cs

Код основной программы. Здесь создаётся делегат и выводится отсортированный массив.

Мультикаст-делегаты

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

Читайте также:  Ведьмак дикая охота игромания

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

Пример 3

Пример использования мультикаст-делегата для вывода приветствия:

Пример 4

Данный код умножает полученное число на два и возводит его же в квадрат:

Типы делегатов

System.Delegate

Смысл примерно тот же, что и у указателей на методы в C++. Однако, в C# делегаты не используют указатели, а сохраняют метаданные, определяющие целевой метод для последующего вызова. Также System.Delegate содержит экземпляр класса System.Reflection.MethodInfo — метаданные .NET для вызова метода через отражения.

Ещё одним важным аспектом System.Delegate является экземпляр объекта, для которого вызывается метод. При наличии неограниченного числа объектов с необходимой сигнатурой нам также нужно определить, какому именно объекту его назначить. Исключение — использование статичного метода, определённого MetodInfo , ведь в таком случае ссылка на объект вернёт null .

System.MulticastDelegate

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

Цепочка делегатов

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

Заключение

Итак, в данной статье были рассмотрены базовые принципы работы делегатов на C#, а также примеры их реализации для использования в реальных кейсах.

Приветствую всех, сегодня хочу еще раз поговорить о делегатах. Давайте вспомним что такое делегат. По сути, это объект, который хранит ссылку на некий метод, и может этот метод вызвать при необходимости. Точнее мы можем вызвать метод через этот объект. И особенность использования делегатов в том, что при объявлении ссылки на объект-делегат мы можем и не знать, на какой конкретно метод, будет ссылаться этот объект. Мы только знаем, что целевой метод должен иметь определенного вида список параметров и тип возвращаемого значения.

Читайте также:  Как подсоединить вай фай к ноутбуку

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

Просто о делегатах

В общем случае делегат представляет собой объект, который может ссылаться на метод. Следовательно, когда создается делегат, то в итоге получается объект, содержащий ссылку на метод. Более того, метод можно вызывать по этой ссылке. Иными словами, делегат позволяет вызывать метод, на который он ссылается.
По сути, делегат — это безопасный в отношении типов объект, указывающий на другой метод (или, возможно, список методов) приложения, который может быть вызван позднее. В частности, объект делегата поддерживает три важных фрагмента информации:

— адрес метода, на котором он вызывается;
— аргументы (если есть) этого метода;
— возвращаемое значение (если есть) этого метода.

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

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

Тип делегата объявляется с помощью ключевого слова delegate. Ниже приведена общая форма объявления делегата:
delegate возвращаемый_тип имя_делегата (список_параметров);
где возвращаемый_тип обозначает тип значения, возвращаемого методами, которые будут вызываться делегатом;
имя_делегата — конкретное имя делегата;
список_параметров — параметры, необходимые для методов, вызываемых делегатом.
Как только будет создан экземпляр делегата, он может вызывать и ссылаться на те методы, возвращаемый тип и параметры которых соответствуют указанным в объявлении делегата. Для создания экземпляра делегата и связывания его с конкретным методом следует записать:

имя_делегата экземпляр_делегата = new имя_делегата(метод);

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

Читайте также:  Reg ru промокод на домен

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

экземпляр_делегата = new имя_делегата(другой_метод);

Пример:

Примечание. Такой способ вызова методов с использованием объектов (экземпляров) делегата был единственным в версии языка C# 1.0 и Visual Studio .Net (c февраля 2002 года). В следующих версиях языка C# 2.0 (Net 2.0, 2005 год) и C# 3.0 (Net 3.5, 2008 год) появились другие способы, связанные с понятием анонимных функций (анонимные методы и лямбда-выражения).

Перейдем к рассмотрению свойств — важнейших разновидностей член-функций классов.

Ссылка на основную публикацию
Гугл карта магнитогорска с улицами и домами
Карта Магнитогорска со спутника. Исследуйте спутниковую карту Магнитогорска онлайн в реальном времени. Подробная карта Магнитогорска создана на основе спутниковых снимков...
Газовый компрессор для заправки газом авто
Ниже представлены домашние газовые заправки российского, итальянского и французского производства. В сравнительной таблице приведены основные технические характеристики и цены на...
Газпромбанк саратов личный кабинет
Газпромбанк на сегодня это стабильная и универсальная финансовая организация, работающая на территории РФ. Банк занимает третье место среди других кредитных...
Гугл карта сургута с улицами и домами
Карта Сургута со спутника. Исследуйте спутниковую карту Сургута онлайн в реальном времени. Подробная карта Сургута создана на основе спутниковых снимков...
Adblock detector