65.委托的本质

  1. 65.委托的本质
    1. 65.1 题目
    2. 65.2 深入解析
    3. 65.3 答题示例
    4. 65.4 关键词联想

65.委托的本质


65.1 题目

C#中委托的本质是什么?它是如何存储函数的?


65.2 深入解析


委托的本质是一个:当我们声明委托类型时,编译器会隐式生成一个对应的类,该类默认继承自System.MulticastDelegate(多播委托类),而System.MulticastDelegate本身又继承自System.Delegate(委托基类)。

这些父类中封装的方法,正是我们操作委托时(如调用、组合、移除等)实际执行的底层逻辑。

从实现上看,委托实例存储的是目标方法的关键信息

  • 对于实例方法:存储两部分内容——方法所在对象的引用(实例指针),以及该方法的内存地址(函数引用)。
  • 对于静态方法:仅需存储方法的内存地址(无需对象引用,因静态方法属于类本身)。

当我们对委托执行+=操作时,C#编译器会自动调用System.Delegate.Combine方法:
该方法并非修改原委托实例,而是创建一个新的委托实例,将原有方法与新增方法的信息组合起来,形成一个包含多方法的“多播委托”。这也是委托支持“链式调用多个方法”的底层原理。


65.3 答题示例

“C# 中的 委托 本质上是由编译器生成的一个类,它继承自 System.MulticastDelegate(又继承自 Delegate)。

  • 当声明 delegate void MyDel(int x);,编译器自动创建一个 MyDel 类。

  • 委托实例内部通过基类的方法维护一个或多个方法入口:

    1. 方法指针(保存函数的内存地址)
    2. 目标对象引用(若为实例方法,保存该实例;静态方法则为 null)
  • += 操作实际上调用基类的 Delegate.Combine,它返回一个新的委托实例,将原有方法链与新方法链接;

  • -= 调用 Delegate.Remove,生成移除后的方法链委托。

因此,委托既是类型安全的函数指针,也是多播事件的底层实现。”


65.4 关键词联想

  • System.MulticastDelegate
  • Delegate 基类
  • 方法指针(Function Pointer)
  • 目标对象引用
  • Delegate.Combine / Delegate.Remove
  • 多播委托
  • 动态生成的委托类
  • 类型安全回调


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏