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
派生
属性
实现

注解

Delegate 是委托类型的基类。 但是,只有系统和编译器可以从 类或 MulticastDelegate 类显式Delegate派生。 也不允许从委托类型派生新类型。 类 Delegate 不被视为委托类型;它是用于派生委托类型的类。

大多数语言实现delegate关键字 (keyword) ,这些语言的编译器能够派生自 MulticastDelegate 类;因此,用户应使用delegate语言提供的关键字 (keyword) 。

注意

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

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

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

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

  • 类型的实例方法,在正式参数列表中公开了隐藏 this 参数。 该委托称为开放实例委托。

  • 静态方法。

  • 一个静态方法和一个可分配给方法的第一个参数的目标对象。 据说代表在第一个论点上被关闭。

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

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

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

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

委托称为多播或可组合,因为委托可以调用一个或多个方法,并且可用于组合操作。

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

注意

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

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

注意

由于方差而与赋值兼容的泛型委托不一定是可组合的。 为了可组合,这些类型必须完全匹配。 例如,假设名为 的 Derived 类派生自名为 的 Base类。 Visual Basic) 中 (Action(Of Base) 类型的Action<Base>委托可以分配给 类型的Action<Derived>变量,但无法组合这两个委托,因为这些类型不匹配。

如果调用的方法引发异常,该方法将停止执行,该异常将传递回委托的调用方,并且不会调用调用列表中的其余方法。 捕获调用方中的异常不会更改此行为。

当委托调用的方法的签名包含返回值时,委托将返回调用列表中最后一个元素的返回值。 当签名包含通过引用传递的参数时,参数的最终值是调用列表中按顺序执行并更新参数值的每个方法的结果。

与 C 中的委托最接近的等效项是函数指针。 委托可以表示静态方法或实例方法。 当委托表示实例方法时,委托不仅存储对方法入口点的引用,还存储对类实例的引用。 与函数指针不同,委托面向对象且类型安全。

有关示例,请参阅 System.Delegate.CreateDelegate 的补充 API 说明

构造函数

Delegate(Object, String)

初始化一个委托,该委托对指定的类实例调用指定的实例方法。

Delegate(Type, String)

初始化一个委托,该委托从指定的类调用指定的静态方法。

属性

HasSingleTarget

表示一个委托,该委托是表示某一静态方法或某一类实例和该类的实例方法的数据结构。

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[])

动态调用(后期绑定)由当前委托所表示的方法。

EnumerateInvocationList<TDelegate>(TDelegate)

表示一个委托,该委托是表示某一静态方法或某一类实例和该类的实例方法的数据结构。

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)

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

适用于

另请参阅