前几天导员讲了讲委托的一些东西,今天在这里小结一下。
委托:
C#中一切都是对象,整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。
声明委托的方式:delegate 返回值类型 委托类型名(参数)
比如:delegate string DeleGet(sring att)
注意:这里除了委托关键字delegate,后面的返回值类型(例子中的第一个string)和参数(例子中的string att)要和委托的函数一致。DeleGet是委托类型名,不是函数名
声明的委托是一种类型,和int、string一样,如果要用的话还需要声明委托类的变量,声明委托类型变量的方式:DeleGet f1;
将委托变量指向函数:DeleGet f1=new DeleGet(SayHello); (或者简写DeleGet f1=SayHello; ),这样就可以像调用普通函数一样把f1当成函数。委托可以看成是函数的指针。
在给一个委托变量添加一个函数后,还可以添加多个:f1+=SayBay; ,这样就形成了一个委托链,当执行这个委托变量的时候就会执行委托变量指向的一个或多个方法。同样的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)
{
OnEvent+=d;
}
public void Remove(yDelegate d)
{
OnEvent-=d;
}
因为OnEvent是private的,所以在类外部不能OnEvent(1)触发事件,但是在类内部可以。
public的方法只有Add和Remove,所以只能+=、-=,其他的操作都是不可以的。