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
Производный
Атрибуты
Реализации

Примеры

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

using namespace System;
delegate String^ myMethodDelegate( // Declares a delegate for a method that takes in an int and returns a String.
int myInt );

// Defines some methods to which the delegate can point.
ref class mySampleClass
{
public:

   // Defines an instance method.
   String^ myStringMethod( int myInt )
   {
      if ( myInt > 0 )
            return ("positive");

      if ( myInt < 0 )
            return ("negative");

      return ("zero");
   }


   // Defines a static method.
   static String^ mySignMethod( int myInt )
   {
      if ( myInt > 0 )
            return ("+");

      if ( myInt < 0 )
            return ("-");

      return ("");
   }

};

int main()
{
   
   // Creates one delegate for each method. For the instance method, an 
   // instance (mySC) must be supplied. For the static method, only the
   // method name is needed.
   mySampleClass^ mySC = gcnew mySampleClass;
   myMethodDelegate^ myD1 = gcnew myMethodDelegate( mySC, &mySampleClass::myStringMethod );
   myMethodDelegate^ myD2 = gcnew myMethodDelegate( mySampleClass::mySignMethod );
   
   // Invokes the delegates.
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".",  -3, myD1(  -3 ), myD2(  -3 ) );
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
}

/*
This code produces the following output:

5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/
using System;
public class SamplesDelegate  {

   // Declares a delegate for a method that takes in an int and returns a string.
   public delegate string myMethodDelegate( int myInt );

   // Defines some methods to which the delegate can point.
   public class mySampleClass  {

      // Defines an instance method.
      public string myStringMethod ( int myInt )  {
         if ( myInt > 0 )
            return( "positive" );
         if ( myInt < 0 )
            return( "negative" );
         return ( "zero" );
      }

      // Defines a static method.
      public static string mySignMethod ( int myInt )  {
         if ( myInt > 0 )
            return( "+" );
         if ( myInt < 0 )
            return( "-" );
         return ( "" );
      }
   }

   public static void Main()  {

      // Creates one delegate for each method. For the instance method, an
      // instance (mySC) must be supplied. For the static method, use the
      // class name.
      mySampleClass mySC = new mySampleClass();
      myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod );
      myMethodDelegate myD2 = new myMethodDelegate( mySampleClass.mySignMethod );

      // Invokes the delegates.
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", -3, myD1( -3 ), myD2( -3 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
   }
}


/*
This code produces the following output:

5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/
Public Class SamplesDelegate

   ' Declares a delegate for a method that takes in an int and returns a String.
   Delegate Function myMethodDelegate(myInt As Integer) As [String]

   ' Defines some methods to which the delegate can point.
   Public Class mySampleClass

      ' Defines an instance method.
      Public Function myStringMethod(myInt As Integer) As [String]
         If myInt > 0 Then
            Return "positive"
         End If
         If myInt < 0 Then
            Return "negative"
         End If
         Return "zero"
      End Function 'myStringMethod

      ' Defines a static method.
      Public Shared Function mySignMethod(myInt As Integer) As [String]
         If myInt > 0 Then
            Return "+"
         End If
         If myInt < 0 Then
            Return "-"
         End If
         Return ""
      End Function 'mySignMethod
   End Class

   Public Shared Sub Main()

      ' Creates one delegate for each method. For the instance method, an
      ' instance (mySC) must be supplied. For the Shared method, the
      ' method name is qualified by the class name.
      Dim mySC As New mySampleClass()
      Dim myD1 As New myMethodDelegate(AddressOf mySC.myStringMethod)
      Dim myD2 As New myMethodDelegate(AddressOf mySampleClass.mySignMethod)

      ' Invokes the delegates.
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".", 5, myD1(5), myD2(5))
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".", - 3, myD1(- 3), myD2(- 3))
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".", 0, myD1(0), myD2(0))

   End Sub

End Class


'This code produces the following output:
' 
'5 is positive; use the sign "+".
'-3 is negative; use the sign "-".
'0 is zero; use the sign "".

Комментарии

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

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

Примечание

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

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

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

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

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

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

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

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

Примечание

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

Когда делегат представляет метод экземпляра, закрытый для первого аргумента (наиболее распространенный случай), делегат сохраняет ссылку на точку входа метода и ссылку на объект, называемый целевым объектом, который имеет тип, который можно присвоить типу, который определил метод. Когда делегат представляет открытый метод экземпляра, он сохраняет ссылку на точку входа метода. Сигнатура делегата должна включать скрытый 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 является указателем на функцию. Делегат может представлять статический метод или метод экземпляра. Когда делегат представляет метод экземпляра, в делегате хранится не только ссылка на точку входа метода, но и ссылка на экземпляр класса. В отличие от указателей функций делегаты являются объектно ориентированными и типизированными.

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

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)

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

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

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