Delegate 类

2013/12/13

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

Namespace:  System
程序集:  mscorlib(位于 mscorlib.dll 中)

public abstract class Delegate

Delegate 类型公开以下成员。

  名称说明
公共属性Method获取委托所表示的方法。
公共属性Target获取类实例,当前委托将对其调用实例方法。
返回顶部

  名称说明
公共方法静态成员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动态调用(后期绑定)由当前委托所表示的方法。
公共方法Equals确定指定的对象和当前委托的类型是否相同,是否共享相同的目标、方法和调用列表。 (重写 Object.Equals(Object)。)
受保护的方法Finalize允许 Object 在垃圾回收器回收该对象之前尝试释放资源并执行其他清理操作。 (从 Object 继承。)
公共方法GetHashCode返回委托的哈希代码。 (重写 Object.GetHashCode()。)
公共方法GetInvocationList返回委托的调用列表。
公共方法GetType获取当前实例的 Type (从 Object 继承。)
受保护的方法MemberwiseClone创建当前 Object 的浅表副本。 (从 Object 继承。)
公共方法静态成员Remove从一个委托的调用列表中移除另一个委托的最后一个调用列表。
公共方法静态成员RemoveAll从一个委托的调用列表中移除另一个委托的所有调用列表。
受保护的方法RemoveImpl从一个委托的调用列表中移除另一个委托的调用列表。
公共方法ToString返回一个字符串,它表示当前的对象。 (从 Object 继承。)
返回顶部

  名称说明
公共运算符静态成员Equality确定指定的委托是否相等。
公共运算符静态成员Inequality确定指定的委托是否相等。
返回顶部

  名称说明
公共扩展方法GetMethodInfo获取一个对象,该对象表示由指定委托表示的方法。 (由 RuntimeReflectionExtensions 定义。)
返回顶部

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

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

说明注意:

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

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

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

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

  • 静态方法。

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

有关在这些情况下委托绑定的示例,请参见 CreateDelegate(Type, Object, MethodInfo, Boolean) 方法重载。

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

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

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

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

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

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

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

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

对所有委托类型自动定义的 BeginInvoke 方法始终引发 NotSupportedException,因此,您不能使用该方法对线程池线程进行异步方法调用。您可以使用 Dispatcher.BeginInvoke(Delegate, Object[]) 方法重载来对 System.Windows.Threading.Dispatcher 对象与之关联的线程执行一个方法,但此技术使用后期绑定并且不采用线程池线程。

平台注释

 多路广播虚函数查找委托在 Windows Phone 7 中引发 NullReferenceException,而 AccessViolationException 在 Windows Phone OS 7.1 中被引发。

下面的示例说明如何定义名为 myMethodDelegate 的委托。为嵌套的 mySampleClass 类的一个实例方法和一个静态方法创建此委托的实例。实例方法的委托需要 mySampleClass 的一个实例。mySampleClass 实例保存在名为 mySC 的变量中。

说明注意:

要运行此示例,请参见生成具有静态 Windows Phone TextBlock 控件的示例


using System;
public class Example
{

   // 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 Demo(System.Windows.Controls.TextBlock outputBlock)
   {

      // 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.
      outputBlock.Text += String.Format("{0} is {1}; use the sign \"{2}\".", 5, myD1(5), myD2(5)) + "\n";
      outputBlock.Text += String.Format("{0} is {1}; use the sign \"{2}\".", -3, myD1(-3), myD2(-3)) + "\n";
      outputBlock.Text += String.Format("{0} is {1}; use the sign \"{2}\".", 0, myD1(0), myD2(0)) + "\n";
   }

}


/*
This code produces the following output:

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



Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

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

显示:
© 2014 Microsoft