这个主题是关于委托的。
一、委托是什么?
委托是用delegate定义的函数指针(其实并不只是一个指针,而是包含一组相关数据)。委托类型定义委托变量,委托变量可以用“函数名”、匿名函数和lambda赋值。而委托变量可以调用该函数。
二、事件是什么?
事件是对委托的封装,类似属性对字段的封装。
事件施加的限制是:一、规定委托的类型,void (Object, EventArgs 或其子类 );二、对外只提供增加关联函数+= 操作和减少关联函数-=操作,而没有提供获取该委托变量的接口,防止任意修改。
只需要在定义委托变量前面加event 关键字就定义了事件,标准事件的委托是EventHandler<T>。编译器会自动生成相关的包装代码。但是也可以自定义包装代码:
event 委托类型 事件名{ add{} remove{} }
三、运用委托
第一步是定义委托类型,第二步定义委托变量,第三步执行委托。
1. int delegate myFunc(int, int);
2. myFunc f1, f2;
f1 = (x,y)=>x+y;
f2 = delegate(int x, int y){return x * y;};
3. f1(1,2); //==3
f2(1,2);//==2
委托的运用场合:当你需要传递参数给某个过程时,可以是选择特定的算法,也可以是通知对象去处理。
事件就是通知对象处理消息这个用途。消息发布者定义事件(委托),而订阅者绑定事件处理函数,当发布者决定引发事件时,就通过调用绑定了的事件处理函数执行相关操作。
发布者不需要了解事件怎么处理,由谁处理,只需要决定引发事件的时机;而订阅者不需要了解事件是怎么发生的,只需要简单关联并提供处理方案。