委托和事件及函数指针的区别
1.委托和事件的区别:
首先最大的区别在于委托是一个类型,而事件最多只能算是一个委托类型的变量.事件作为委托类型的变量时,是私有的,但提供两个方法,一个是add一个remove用以追加和删除事件元素.在这私有访问修饰符和两个默认方法的基础上可以展现出事件与委托在安全层面上的区别,委托对象是公有的,在任何地方都可以被调用,因而难以避免被随意调用和冒名触发.且除了多播委托的追加和移除方法是用+=和-=,此外委托对象的赋值都是使用=号,这种赋值方法在追加方法时容易误操作而清空委托对象内原本的内容.而事件则不同,首先事件是在委托对象的基础上加了event关键字.加了event关键字之后,这个委托对象在编辑器里的图标已经从原本的蓝色格子变成了一道屎黄色的闪电,这一个改变是巨大的,就像成人礼一般.是标志着一个小对象从此长大成了事件.而改变之后的事件君已经完全与委托对象这种小正太不同了,再也不是任人调用,想改就改的了.因为事件君的私有特征,除了声明自己的类可以调用,此外任何地方都不能被调用,这就妥善的完爆了那些能调戏对象还想调戏事件君的外部类和外部方法.而事件君又留有一个形似属性中getset的与外部联系的出入口,即remove和add方法.用以移除和追加事件,但是任谁也不能像欺负委托对象那样,用一个=号就把原本的内容给替换了,因为事件君不认识啥是等号.此外事件君也不能用来给别的事件赋值,因为事件君说了,它只站在+=或-=的左边,至于右边嘛,呵呵,不如你去问问对象君?
2.委托与函数指针的区别:
委托具有面向对象的特征,而指针是一个面向过程的函数,指针只是表示一个地址或指向,而委托这个C#中的概念有着非常明确的层级结构.从object这个面向对象的根类开始往下追溯,Delegate类就是委托的超级父类,由于委托对象能接受多个方法,即多播委托的存在,因为在Delegate类下有一个叫做MulticastDelegate类在支持多播委托,这个类中,有两个字段,一个是_invocationCount用以记录个中元素的数量,一个是_invocationList,这个其实是object类型的数组,用以存储接收到的委托变量的值,且这个数组的原始大小及capacity的增长都是编译器自动完成.当然由于它是数组,那么想遍历个中元素也是可以的.遍历时通过一个强制类型转换,从object类转换成相应类型后还是可以逐个访问.而multicastDelegate是直接派生出用户自定义的委托类型的类.因而用户自定义的委托类型依然具备这些类成员,在用户自定义的委托类型中有个字段叫做_taget.给这个委托对象的赋值就是由这个字段接收并在上级类即MulticastDelegate类继承来的_invocationList集合中加上该值.这就是委托通过继承展现出来的层级结构,这是委托的一大特征.而指针君,是没有的.