System.Delegate 类

方法描述

表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。

语法定义(C# System.Delegate 类 的用法)

[SerializableAttribute]
[ClassInterfaceAttribute(ClassInterfaceType.AutoDual)]
[ComVisibleAttribute(true)]
public abstract class Delegate : ICloneable, 
	ISerializable

构造函数

构造函数名称 构造函数描述
Delegate(Object, String) 初始化一个委托,该委托对指定的类实例调用指定的实例方法。
Delegate(Type, String) 初始化一个委托,该委托从指定的类调用指定的静态方法。

成员/方法

方法名称 方法描述
Clone 创建委托的浅表副本。
Combine(Delegate[]) 将委托数组的调用列表连接在一起。
Combine(Delegate, Delegate) 将两个委托的调用列表连接在一起。
CombineImpl 将指定多路广播(可组合)委托和当前多路广播(可组合)委托的调用列表连接起来。
CreateDelegate(Type, MethodInfo) 创建指定类型的委托以表示指定的静态方法。
CreateDelegate(Type, Object, MethodInfo) 使用指定的第一个参数创建指定类型的委托,该委托表示指定的静态方法或实例方法。
CreateDelegate(Type, Object, String) 创建指定类型的委托,该委托表示要对指定的类实例调用的指定实例方法。
CreateDelegate(Type, MethodInfo, Boolean) 使用针对绑定失败的指定行为,创建用于表示指定静态方法的指定类型的委托。
CreateDelegate(Type, Type, String) 创建指定类型的委托,该委托表示指定类的指定静态方法。
CreateDelegate(Type, Object, MethodInfo, Boolean) 使用指定的第一个参数和针对绑定失败的指定行为,创建表示指定的静态方法或实例方法的指定类型的委托。
CreateDelegate(Type, Object, String, Boolean) 创建指定类型的委托,该委托表示要按指定的大小写敏感度对指定类实例调用的指定实例方法。
CreateDelegate(Type, Type, String, Boolean) 使用用于指定是否区分大小写的值创建指定类型的委托,该委托表示指定类的指定静态方法。
CreateDelegate(Type, Object, String, Boolean, Boolean) 使用用于指定是否区分大小写的值和针对绑定失败的指定行为,创建指定类型的委托,该委托表示要对指定类实例调用的指定实例方法。
CreateDelegate(Type, Type, String, Boolean, Boolean) 使用用于指定是否区分大小写的值和针对绑定失败的指定行为,创建指定类型的委托,该委托表示指定类的指定静态方法。
DynamicInvoke 动态调用(后期绑定)由当前委托所表示的方法。
DynamicInvokeImpl 动态调用(后期绑定)由当前委托所表示的方法。
Equals 确定指定的对象和当前委托的类型是否相同,是否共享相同的目标、方法和调用列表。 (重写 Object.Equals(Object)。)
Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。) 在 XNA Framework 中,此成员由 Finalize() 重写。
GetHashCode 返回委托的哈希代码。 (重写 Object.GetHashCode()。)
GetInvocationList 返回委托的调用列表。
GetMethodImpl 获取当前委托所表示的静态方法。
GetObjectData 不支持。
GetType 获取当前实例的 Type。 (继承自 Object。)
MemberwiseClone 创建当前 Object 的浅表副本。 (继承自 Object。)
Remove 从一个委托的调用列表中移除另一个委托的最后一个调用列表。
RemoveAll 从一个委托的调用列表中移除另一个委托的所有调用列表。
RemoveImpl 从一个委托的调用列表中移除另一个委托的调用列表。
ToString 返回表示当前对象的字符串。 (继承自 Object。)

提示和注释

Delegate 类是委托类型的基类。 然而,只有系统和编译器可以显式地从 Delegate 类或 MulticastDelegate 类派生。 此外,还不允许从委托类型派生新类型。 Delegate 类不是委托类型,该类用于派生委托类型。

大多数语言实现 delegate 关键字,这些语言的编译器能够从 MulticastDelegate 类进行派生;所以,用户应当使用语言所提供的 delegate 关键字。

注意

公共语言运行时为每个委托类型提供 Invoke 方法(使用与该委托相同的签名)。 不必从 C#、Visual Basic 或 Visual C++ 显式调用此方法,因为编译器将自动调用此方法。 需要查找委托类型的签名时 Invoke 方法在 反射 上很有用。

公共语言运行时给每个委托类型提供 BeginInvoke 和 EndInvoke 方法,以启用该委托的异步调用。 有关这些方法的更多信息,请参见使用异步方式调用同步方法。

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

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

某种类型的实例方法(包含在形参表中公开的隐藏 this 参数)。 该委托称为开放式实例委托。

静态方法。

静态方法和可分配给该方法的第一个参数的目标对象。 该委托称为通过其第一个参数关闭。

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

注意

在 .NET Framework 1.0 版和 1.1 版中,仅当方法的签名与委托类型指定的签名完全匹配时,委托才可以表示方法。 因此,仅支持上面列表中的第一项和第三项,且第一项要求与类型完全匹配。

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

当委托表示静态方法时,委托存储对该方法入口点的引用。 当委托表示通过其第一个参数关闭的静态方法时,委托存储对该方法入口点的引用和对目标对象(该对象可分配给方法第一个参数的类型)的引用。 调用该委托时,静态方法的第一个参数接收目标对象。

委托的调用列表就是已排序的委托集,其中列表的每个元素恰好调用该委托表示的一个方法。 调用列表可以包含重复的方法。 在调用期间,按方法出现在调用列表中的顺序来调用它们。 委托尝试调用其调用列表中的每个方法,而重复方法在调用列表中出现一次就调用一次。 委托是不可变的;一旦创建,委托的调用列表便无法更改。

委托被称作多路广播委托或可组合委托,因为委托可以调用一种或多种方法,并且可以用在组合操作中。

合并操作(如 Combine 和 Remove)并不改变现有委托。 相反,这样的操作返回一个新委托,其中包含操作结果、未更改的委托或 null。 当合并操作的结果是没有引用任何方法的委托时,该操作返回 null。 当所请求的操作无效时,合并操作返回未更改的委托。

注意

托管语言使用 Combine 和 Remove 方法实现委托操作。 示例包括 Visual Basic 中的 AddHandler 和 RemoveHandler 语句以及 C# 中委托类型上的 += 和 -= 运算符。

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

注意

赋值兼容的泛型委托由于变化不一定可组合。 若要可组合,类型必须完全匹配。 例如,假设一个名为 Derived 的类派生自名为 Base 的类。 类型为 Action(在 Visual Basic 中为 Action(Of Base))的委托可以赋值给类型为 Action 的变量,但是无法组合两个委托,因为类型不完全匹配。

如果所调用的方法引发异常,则方法停止执行,并将异常向回传递给委托的调用方,且不再调用调用列表中其余的方法。 捕捉调用方的异常并不改变此行为。

当委托所调用的方法的签名包含返回值时,委托返回调用列表中最后一个元素的返回值。 当签名包含由引用传递的参数时,该参数的最终值就是调用列表中每个方法的结果,这些方法依序执行并更新参数的值。

在 C 或 C++ 中与委托最为相似的是函数指针。 委托可以表示静态方法或实例方法。 当委托表示实例方法时,委托不仅存储对方法入口点的引用,还存储对类实例的引用。 与函数指针不同,委托是面向对象和类型安全的。

System.Delegate 类例子

mySampleClass 实例保存在名为 mySC 的变量中。

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 "".
*/

继承层次结构

System.Object

System.Delegate

System.MulticastDelegate

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

线程安全

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。