Введение

Делегаты - это тип безопасного указателя функции, используемый Общей языковой инфраструктурой (CLI). Делегаты указывают метод для вызова и, по желанию, объект для вызова метода. Делегаты используются, среди прочего, для реализации обратных вызовов и слушателей событий. Делегированный объект инкапсулирует ссылку на метод. Затем объект делегирования может быть передан коду, который может вызвать ссылаемый метод, без необходимости знать во время компиляции, какой метод будет вызван. Делегатом многопространства является делегат, который указывает на несколько методов. Делегация мультикаста - это механизм, который обеспечивает функциональность для выполнения более одного метода. Внутри сохраняется список делегатов, и когда вызван делегат многоканального вещания, список делегатов выполняется. В C# делеги часто используются для реализации обратных вызовов в программировании, управляемом событиями. Например, делегат может быть использован для указания, какой метод должен быть вызван, когда пользователь нажимает на какую-либо кнопку. Делегаты позволяют программисту уведомлять несколько методов о том, что событие произошло.

Подробности технического применения

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

Выступление

Использование делегированных систем раньше было намного медленнее, чем призыв виртуального или интерфейсного метода (в 6 - 8 раз медленнее в сравнении с Microsoft 2003 года), но с момента выхода NET 2.0 CLR в 2005 году оно примерно такое же, как призывы интерфейса. Это означает, что есть небольшой дополнительный накладный расход по сравнению с прямыми вызовами метода. Существуют очень строгие правила построения классов делегатов. Эти правила позволяют оптимизировать компиляторы большим количеством свободы при оптимизации делегатов при обеспечении безопасности типа.