委托
委托为什么可以不new
不写NEW的时候,编译的时候会自动隐士转换为NEW
委托的实质
函数的调用都是先寻找函数的首地址,然后在去调用,而委托的本质是记录函数的首地址,就和调用函数的本质一样。类似于函数指针
一定要new才能给其中的成员元素赋值,为什么呢?因为其没有初始化,没有为改变量申请内存空间,只有变量名有内容空间。原因:委托可以不用new的原因就是因为变量名可以直接赋予函数的首地址,可以去直接访问。(?)
委托是类,因此凡是能够定义类的地方,都能定义委托
委托多播
要创建一个多播委托,可以使用 "+="
运算符将一个委托与另一个委托连接起来,形成一个包含多个方法引用的新委托。
委托多播本质上是存入多个函数的首地址,因为委托是引用类型本质是存入委托函数的首地址
事件
事件的创建需要一个委托才能声明
事件只能在类中声明,把委托当成一种特殊的变量类型,事件就是委托的实例
事件只能在当前的类中invoke
类外只能+-函数
总的来说事件Event是一个添加了许多限制的委托。
类外调用方法
总结:
1、委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的指针。
2、委托和事件没有可比性,因为委托是类型,事件是对象
3、其实事件是委托的一个修饰符,加了event(事件)修饰之后,委托就被阉割了,假设这个加了修饰符的事件称为事件1,通过事件1我们可以更好地控制注册和注销,也就是对于一个外部类,那么他只能“注册自己+=、注销自己-=”,例如上面的ClassA,如果我们事件的注册是在ClassA内部进行的,那么它就只能注册自己内部的方法到事件上。另外,外界也不能主动地触发一个事件。事件只能add、remove自己,不能赋值。也就是说事件只能+=、-=,不能= 。当我们反编译以上例子的源程序的时候,我们可以发现事件内部就是一个private的委托和add、remove两个方法 (如下图所示)。