c#进阶之浅析委托和事件
何为委托
加了delegate关键字,没有方法体{}的方法模版(方法列表);委托是一种类型
public void Write() { //TODO } //加上关键字delegate,去掉方法体{} public delegate void Write();
委托的使用
委托基础使用三部曲:1初始化声明的委托 2绑定定义的方法 3使用
绑定方法与声明的委托的参数签名必须一致(参数个数,对应类型,返回类型)
class Program { //定义方法 public static void WriteFun() { //TODO } public static void GetFun(int y) { //TODO } public static string SetFun() { return ""; } //声明委托 public delegate void Write(); public delegate void Get(int x); public delegate string Set(); static void Main(string[] args) { //初始化委托,绑定方法 Write write = new Write(WriteFun); //可简写Write write = WriteFun; Get get = GetFun; Set set = SetFun; //直接使用或者用invoke() write();//write.Invoke(); get(3);//get.Invoke(3); string str = set();//string str = set.Invoke(); } }
多播委托
上面说过委托是方法列表:委托可以一次绑定多个方法,通过+=和-=来绑定和解除绑定;
class Program { public static void WriteFun() { //TODO } public static void WriteFun1() { //TODO } public static void WriteFun2() { //TODO } public delegate void Write(); static void Main(string[] args) { Write write = WriteFun; write += WriteFun; write -= WriteFun; write += WriteFun1; write += WriteFun2; write.Invoke(); } }
委托和事件
委托是一种类型,事件是加了关键字event的委托实例
相比与上述的普通委托实例,事件更加特殊,它不能被初始化,且不能被外部调用
public class Button { public ButtonClickHandle ButtonClickHandle; public event ButtonClickHandle ButtonClickHandleEvent; public void click() { if (ButtonClickHandle !=null) { ButtonClickHandle.Invoke(); } if (ButtonClickHandleEvent != null) { ButtonClickHandleEvent.Invoke(); } } } public delegate void ButtonClickHandle();
区别如下
不能被初始化和外部调用,这是一种权限控制的安全机制
PS
委托尽量不要自己去实现,一方面是官方已经提供了Func与Action两种有无返回的委托,基本够用;另一方面是,委托是一种类型,如果委托的类型过多,会造成泛滥且不能够通用
进阶
出自:博客园-半路独行
原文地址:http://www.cnblogs.com/banluduxing/p/8999428.html
本文出自于http://www.cnblogs.com/banluduxing 转载请注明出处。