Поделиться через


Delegate Класс

Определение

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

public ref class Delegate abstract
public ref class Delegate abstract : ICloneable, System::Runtime::Serialization::ISerializable
public abstract class Delegate
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
type Delegate = class
type Delegate = class
    interface ICloneable
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
type Delegate = class
    interface ICloneable
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Delegate = class
    interface ICloneable
    interface ISerializable
Public MustInherit Class Delegate
Public MustInherit Class Delegate
Implements ICloneable, ISerializable
Наследование
Delegate
Производный
Атрибуты
Реализации

Комментарии

Класс Delegate является базовым классом для типов делегатов. Однако только системные и компиляторы могут быть явным образом производными от класса Delegate или из класса MulticastDelegate. Кроме того, не допускается наследование нового типа от типа делегата. Класс Delegate не считается типом делегата; это класс, используемый для производных типов делегатов.

Большинство языков реализуют ключевое слово delegate и компиляторы для этих языков могут быть производными от класса MulticastDelegate; таким образом, пользователи должны использовать ключевое слово delegate, предоставленное языком.

Заметка

Среда CLR предоставляет метод Invoke для каждого типа делегата с той же подписью, что и делегат. Не нужно явно вызывать этот метод из C#, Visual Basic или Visual C++, так как компиляторы вызывают его автоматически. Метод Invoke полезен в отражения при поиске подписи типа делегата.

Среда CLR предоставляет каждый тип делегата с BeginInvoke и методами EndInvoke, чтобы включить асинхронное вызов делегата. Дополнительные сведения об этих методах см. в асинхронновызовов синхронных методов.

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

  • Метод экземпляра типа и целевого объекта, назначаемого данному типу.

  • Метод экземпляра типа с скрытым параметром this, предоставляемым в списке формальных параметров. Делегат считается делегатом открытого экземпляра.

  • Статический метод.

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

Дополнительные сведения о привязке делегата см. в разделе перегрузки метода CreateDelegate(Type, Object, MethodInfo, Boolean).

Когда делегат представляет метод экземпляра, закрытый по его первому аргументу (наиболее распространенному варианту), делегат сохраняет ссылку на точку входа метода и ссылку на объект, называемый целевым объектом, который является типом, который можно назначить типу, определяемому методом. Когда делегат представляет открытый метод экземпляра, он сохраняет ссылку на точку входа метода. Подпись делегата должна включать скрытый параметр this в его формальный список параметров; В этом случае делегат не имеет ссылки на целевой объект, а целевой объект должен быть предоставлен при вызове делегата.

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

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

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

Объединение операций, таких как Combine и Remove, не изменяет существующие делегаты. Вместо этого такая операция возвращает новый делегат, содержащий результаты операции, неизменяемый делегат или null. Операция объединения возвращает null, когда результат операции является делегатом, который не ссылается по крайней мере на один метод. Операция объединения возвращает без изменений делегат, если запрошенная операция не действует.

Заметка

Управляемые языки используют методы Combine и Remove для реализации операций делегирования. Примеры включают операторы AddHandler и RemoveHandler в Visual Basic и операторы += и -= для типов делегатов в C#.

Начиная с .NET Framework 4 универсальные типы делегатов могут иметь параметры типа вариантов. Параметры контравариантного типа можно использовать в качестве типов параметров делегата, а параметр ковариантного типа можно использовать в качестве возвращаемого типа. Эта функция позволяет универсальным типам делегатов, созданным из того же определения универсального типа, быть совместимым с назначением, если их аргументы типов являются ссылочными типами с отношением наследования, как описано в ковариации и контравариации.

Заметка

Универсальные делегаты, совместимые с назначением из-за дисперсии, не обязательно объединяются. Для объединения типы должны соответствовать точно. Например, предположим, что класс с именем Derived является производным от класса с именем Base. Делегат типа Action<Base> (Action(Of Base) в Visual Basic) можно назначить переменной типа Action<Derived>, но два делегата не могут быть объединены, так как типы не соответствуют точно.

Если вызываемый метод вызывает исключение, метод перестает выполняться, исключение передается вызывающей стороне делегата и остальные методы в списке вызовов не вызываются. Перехват исключения в вызывающем объекте не изменяет это поведение.

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

Ближайшим эквивалентом делегата в C является указатель функции. Делегат может представлять статический метод или метод экземпляра. Когда делегат представляет метод экземпляра, делегат сохраняет не только ссылку на точку входа метода, но и ссылку на экземпляр класса. В отличие от указателей функций, делегаты являются объектно ориентированными и типобезопасны.

Примеры см. в дополнительных примечаниях API для System.Delegate.CreateDelegate.

Конструкторы

Delegate(Object, String)

Инициализирует делегат, который вызывает указанный метод экземпляра в указанном экземпляре класса.

Delegate(Type, String)

Инициализирует делегат, вызывающий указанный статический метод из указанного класса.

Свойства

HasSingleTarget

Возвращает значение, указывающее, имеет ли Delegate один целевой объект вызова.

Method

Возвращает метод, представленный делегатом.

Target

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

Методы

Clone()

Создает неглубокую копию делегата.

Combine(Delegate, Delegate)

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

Combine(Delegate[])

Объединяет списки вызовов массива делегатов.

Combine(ReadOnlySpan<Delegate>)

Объединяет списки вызовов диапазона делегатов.

CombineImpl(Delegate)

Объединяет списки вызовов указанного делегата многоадресной рассылки (комбинируемой) и текущего делегата многоадресной рассылки (комбинируемой).

CreateDelegate(Type, MethodInfo)

Создает делегат указанного типа для представления указанного метода.

CreateDelegate(Type, MethodInfo, Boolean)

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

CreateDelegate(Type, Object, MethodInfo)

Создает делегат указанного типа, представляющего указанный статический или экземплярный метод с указанным первым аргументом.

CreateDelegate(Type, Object, MethodInfo, Boolean)

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

CreateDelegate(Type, Object, String)

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

CreateDelegate(Type, Object, String, Boolean)

Создает делегат указанного типа, который представляет указанный метод экземпляра, который вызывается в указанном экземпляре класса с указанной конфиденциальности регистра.

CreateDelegate(Type, Object, String, Boolean, Boolean)

Создает делегат указанного типа, представляющего указанный метод экземпляра для вызова в указанном экземпляре класса, с заданным регистром конфиденциальности и указанным поведением при привязке.

CreateDelegate(Type, Type, String)

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

CreateDelegate(Type, Type, String, Boolean)

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

CreateDelegate(Type, Type, String, Boolean, Boolean)

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

DynamicInvoke(Object[])

Динамически вызывает метод (поздняя привязка), представленный текущим делегатом.

DynamicInvokeImpl(Object[])

Динамически вызывает метод (поздняя привязка), представленный текущим делегатом.

EnumerateInvocationList<TDelegate>(TDelegate)

Возвращает перечислитель для целевых объектов вызова этого делегата.

Equals(Object)

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

GetHashCode()

Возвращает хэш-код делегата.

GetInvocationList()

Возвращает список вызовов делегата.

GetMethodImpl()

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

GetObjectData(SerializationInfo, StreamingContext)
Устаревшие..

Не поддерживается.

GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
Remove(Delegate, Delegate)

Удаляет последнее вхождение списка вызовов делегата из списка вызовов другого делегата.

RemoveAll(Delegate, Delegate)

Удаляет все вхождения списка вызовов делегата из списка вызовов другого делегата.

RemoveImpl(Delegate)

Удаляет список вызовов делегата из списка вызовов другого делегата.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Операторы

Equality(Delegate, Delegate)

Определяет, равны ли указанные делегаты.

Inequality(Delegate, Delegate)

Определяет, равны ли указанные делегаты.

Методы расширения

GetMethodInfo(Delegate)

Возвращает объект, представляющий метод, представленный указанным делегатом.

Применяется к

См. также раздел