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.Combin

你可能感兴趣的:(Unity,3D,C#,委托)