委托:
C#中一切都是对象,整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。
声明委托的方式:delegate 返回值类型 委托类型名(参数)
比如:delegate string DeleGet(sring att)
注意:这里除了委托关键字delegate,后面的返回值类型(例子中的第一个string)和参数(例子中的string att)要和委托的函数一致。DeleGet是委托类型名,不是函数名
声明的委托是一种类型,和int、string一样,如果要用的话还需要声明委托类的变量,声明委托类型变量的方式:DeleGet
将委托变量指向函数:DeleGet
在给一个委托变量添加一个函数后,还可以添加多个:f1+=SayBay;
事件:
事件语法:event ProcessWordDelegate OnWord;
加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。在IntUC类外部就不能通过OnIntInput(3)的方式调用注册的委托了。只能+=、-=!对比“事件1”、“事件2”两个项目区别,“事件和委托的区别”就都明白了!
委托和事件没有可比性,因为委托是类型,事件是属性(对象),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。
因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。
事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能=
event会自动生成一个delegate变量和两个函数: add和remove,C#编译器用这两个方法支持+=和-=操作符 (*)
public event MyDelegate OnEvent;
内部实现是(不严格的解释)
private MyDelegate OnEvent;
public void Add(MyDelegate d)
{
}
public void Remove(yDelegate d)
{
}
因为OnEvent是private的,所以在类外部不能OnEvent(1)触发事件,但是在类内部可以。
public的方法只有Add和Remove,所以只能+=、-=,其他的操作都是不可以的。