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 。 实例方法的委托需要的实例 mySampleClassmySampleClass实例保存在一个名为的变量中 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 语言提供的关键字。

备注

公共语言运行时为 Invoke 每个委托类型提供了一个方法,其签名与委托的签名相同。 无需从 c #、Visual Basic 或 Visual C++ 显式调用此方法,因为编译器会自动调用此方法。 Invoke当您想要查找委托类型的签名时,方法在反射中很有用。

公共语言运行时为每个委托类型提供 BeginInvokeEndInvoke 方法,以启用委托的异步调用。 有关这些方法的详细信息,请参阅 异步调用同步方法

委托类型的声明建立一个协定,该协定指定一个或多个方法的签名。 委托是引用了的委托类型的实例:

  • 类型的实例方法和可分配给该类型的目标对象。

  • 类型的实例方法,其中的隐藏 this 参数在形参表中公开。 委托称为开放实例委托。

  • 静态方法。

  • 一个静态方法和一个目标对象,可分配给该方法的第一个参数。 委托被认为是在其第一个参数上关闭。

有关委托绑定的详细信息,请参阅 CreateDelegate(Type, Object, MethodInfo, Boolean) 方法重载。

备注

在 .NET Framework 版本1.0 和1.1 中,委托只能表示方法的签名与委托类型指定的签名完全匹配。 因此,只支持前面列表中的第一个和第三个项目符号,而第一个项目符号需要完全类型匹配。

当某个委托表示在最常见的情况) 下,在其第一个参数 (关闭的实例方法时,该委托将存储对该方法入口点的引用以及对该对象的引用,该对象的类型为可分配给定义此方法的类型的类型。 当委托表示开放式实例方法时,它存储对该方法的入口点的引用。 委托签名必须 this 在其形参表中包含 hidden 参数; 在这种情况下,该委托不具有对目标对象的引用,并且在调用委托时必须提供目标对象。

如果委托表示静态方法,则委托存储对方法的入口点的引用。 如果委托表示在其第一个参数上关闭的静态方法,则该委托存储对方法的入口点的引用,并存储对可分配给该方法的第一个参数类型的目标对象的引用。 调用委托时,静态方法的第一个参数将接收目标对象。 第一个参数必须是引用类型。

委托的调用列表是一组有序委托,其中列表的每个元素都只调用由委托表示的方法之一。 调用列表可以包含重复的方法。 在调用期间,将按照调用列表中出现的顺序调用方法。 委托尝试调用其调用列表中的每个方法;对于每次出现在调用列表中的重复项,都会调用一次。 委托是不可变的;一旦创建,委托的调用列表将不会更改。

委托称为多播,或者是可组合的,因为委托可以调用一个或多个方法,并且可以在组合操作中使用。

组合操作(如 CombineRemove )不会改变现有委托。 相反,此类操作返回一个新委托,其中包含操作的结果、未更改的委托或 nullnull当操作的结果是一个委托,该委托未引用至少一个方法时,组合操作返回。 当请求的操作不起作用时,组合操作返回未更改的委托。

备注

托管语言使用 CombineRemove 方法来实现委托操作。 例如,在 AddHandler RemoveHandler c # 中的委托类型上 Visual Basic 和 + = 和-= 运算符中包含和语句。

从 .NET Framework 4 开始,泛型委托类型可以具有变体类型参数。 逆变类型参数可用作委托的参数类型,协变类型参数可用作返回类型。 此功能允许从同一泛型类型定义构造的泛型委托类型成为赋值兼容的泛型委托类型(如果其类型参数是具有继承关系的引用类型),如 协变和逆变中所述。

备注

与赋值兼容的泛型委托不一定是可组合的。 要使其可组合,类型必须完全匹配。 例如,假设名为的类 Derived 派生自名为的类 BaseAction<Base>Visual Basic) 中 (类型的委托 Action(Of Base) 可以分配给类型的变量 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)

获取指示指定委托表示的方法的对象。

适用于

另请参阅