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类。委托实例内部通过基类的方法维护一个或多个方法入口:
- 方法指针(保存函数的内存地址)
- 目标对象引用(若为实例方法,保存该实例;静态方法则为 null)
+=操作实际上调用基类的Delegate.Combine,它返回一个新的委托实例,将原有方法链与新方法链接;
-=调用Delegate.Remove,生成移除后的方法链委托。因此,委托既是类型安全的函数指针,也是多播事件的底层实现。”
65.4 关键词联想
System.MulticastDelegateDelegate基类- 方法指针(Function Pointer)
- 目标对象引用
Delegate.Combine/Delegate.Remove- 多播委托
- 动态生成的委托类
- 类型安全回调
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com