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 类是委托类型的基类。 但是,只有系统和编译器才能从 Delegate 类或 MulticastDelegate 类显式派生。 不允许从委托类型派生新类型。 Delegate 类不被视为委托类型;它是用于派生委托类型的类。

大多数语言实现 delegate 关键字,并且这些语言的编译器可以从 MulticastDelegate 类派生;因此,用户应使用语言提供的 delegate 关键字。

注意

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

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

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

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

  • 类型的实例方法,在正式参数列表中公开隐藏 this 参数。 该代表据说是公开的实例委托。

  • 静态方法。

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

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

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

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

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

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

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

注意

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

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

注意

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

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

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

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

有关示例,请参阅 System.Delegate.CreateDelegate的补充 API 备注。

构造函数

Delegate(Object, String)

初始化在指定类实例上调用指定实例方法的委托。

Delegate(Type, String)

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

属性

HasSingleTarget

获取一个值,该值指示 Delegate 是否具有单个调用目标。

Method

获取委托表示的方法。

Target

获取当前委托调用实例方法的类实例。

方法

Clone()

创建委托的浅表副本。

Combine(Delegate, Delegate)

连接两个委托的调用列表。

Combine(Delegate[])

连接委托数组的调用列表。

Combine(ReadOnlySpan<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)

获取一个对象,该对象表示由指定委托表示的方法。

适用于

另请参阅