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 универсальные типы делегатов могут иметь параметры типа variant. Параметры контравариантного типа можно использовать в качестве типов параметров делегата, а параметр ковариантного типа — в качестве возвращаемого типа. Эта функция позволяет универсальным типам делегатов, созданным на основе одного определения универсального типа, быть совместимыми с назначением, если их аргументы типа являются ссылочными типами с отношениями наследования, как описано в разделе Ковариация и контрвариантность.

Примечание

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

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

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

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

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

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

Delegate(Object, String)

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

Delegate(Type, String)

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

Свойства

Method

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

Target

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

Методы

Clone()

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

Combine(Delegate, Delegate)

Сцепляет списки вызовов двух делегатов.

Combine(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[])

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

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)

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

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

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