C# 委托Delegate原理总结

  1. 类型安全:比如c#的委托就是类型安全的,为什么呢?C/C++非成员函数的地址本质就是一个内存地址,这个地址不携带任何额外信息,比如函数收到的参数个数、参数类型、函数返回类型、函数的调用协定。任何调用方式都可以很轻易的调用函数,从而在编译层面不报错,而运行中出错。这就是类型不安全的。

  2. C#编译器和CLR对委托所做的额外隐藏工作

    1. 委托本质是定义了一个类:

      
      
      
               internal Class Feedback : MulticastDelegate
                 {    
                     //注意,这里自动生成的Invoke函数签名会与委托定义时候的签名一致。        
                     public virture Invoke(Int x); 
                     ....
                 }	
      
      
    2. 所以,public delegate void FeedBack (int x);的定义位置和其他类型的位置是一样的。

  3. 委托类型的调用方式:Fb() => Fb.Invoke(),编译器在编译的时候会自动转换。

    1. 这个调用方式并不是反射,效率很高。

    2. 这个使用的前提是,开发者知道回调方法的原型。

  4. Delegate.DynamicInvoke(),采用的是反射,效率较低。

  5. 委托链:C = Delegate.Combine(A,B)方法中:

    • Combine会先额外创建一个委托对象,并初始化_target,_methodPtr和_invocationList;(_target,_methodP

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值