C#面试题更新 2026-08-05

C#中的委托如何支持对多个方法的调用?其内部实现机制是怎样的?

技术原理C#

考察说明

考查对C#委托多播底层实现的理解

回答思路

  1. 【回答框架 1】多播委托本质是一个继承自System.MulticastDelegate的类实例,内部维护一个委托链表,每个节点指向一个方法及其目标对象。
  2. 【回答框架 2】通过组合委托(使用+或+=)时,实际上创建了新的委托实例,其调用列表为两个委托调用列表的合并,而非修改原委托。
  3. 【回答框架 3】调用多播委托时,按顺序同步调用列表中的所有方法,返回值只取最后一个方法的返回值,若中途抛异常则中断后续调用。
  4. 【回答框架 4】支持通过-或-=从调用列表中移除方法,移除操作同样生成新实例,且会匹配最后一个符合条件的委托。
  5. 【回答框架 5】多播委托的调用列表可通过GetInvocationList方法获取,便于逐个调用和异常处理。
  6. 【关键点 1】多播委托内部是委托链表,组合产生新实例。
  7. 【关键点 2】调用时顺序执行,返回最后方法的结果,异常会中断。
  8. 【关键点 3】GetInvocationList可用于手动遍历和异常隔离。
  9. 【易错点 1】误以为+=修改原委托实例,实际是返回新委托,注意引用更新。
  10. 【易错点 2】多播委托的返回值只保留最后一个,若需处理每个结果需手动遍历。
  11. 【易错点 3】异常会中断后续方法调用,需在遍历中单独try-catch。