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 "".
*/
// Declares a delegate for a method that takes in an int and returns a string.
type MyMethodDelegate = delegate of int -> string

// Defines some methods to which the delegate can point.
type MySampleClass() =
    // Defines an instance method.
    member _.MyStringMethod(myInt) =
        if myInt > 0 then "positive"
        elif myInt < 0 then "negative"
        else "zero"

    // Defines a static method.
    static member MySignMethod(myInt) =
        if myInt > 0 then "+"
        elif myInt < 0 then "-"
        else ""

// Creates one delegate for each method. For the instance method, an
// instance (mySC) must be supplied. For the static method, use the
// class name.
let mySC = MySampleClass()
let myD1 = MyMethodDelegate mySC.MyStringMethod
let myD2 = MyMethodDelegate MySampleClass.MySignMethod

// Invokes the delegates.
printfn $"{5} is {myD1.Invoke 5} use the sign \"{myD2.Invoke 5}\"."
printfn $"{-3} is {myD1.Invoke -3} use the sign \"{myD2.Invoke -3}\"."
printfn $"{0} is {myD1.Invoke 0} use the sign \"{myD2.Invoke 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)

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

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

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