C#——委托与事件
首先,来了解一下什么是委托,什么是事件,这两者之间有什么区别?
委托:
(1)是一种数据类型,可以像类一样声明数据类型,声明变量
(2)只有委托才能将方法当做变量来保存
(3)不同类型的方法需要使用不同的委托类型来存储,所以不同类型的方法需要定义不同的类来存储不同的对象
(4)同一种方法可以使用同一个委托类型来存储
先通过一小段代码来了解一下
//先定义一个委托,委托也可以声明变量,还有返回值 public delegate void MyDelegate(); public delegate void MyDelegate1(int n,int m); public delegate void MyDelegate2(string msg); public delegate int MyReturnIntDelegate();//返回为int类型的委托 class Program { static void Main(string[] args) { M1(SayHello);//将SayHello方法作为参数传入 MyDelegate1 d1 = Add;//直接将Add方法赋值个MyDelegate1 d1(2, 3); Console.ReadKey(); } static void SayHello() { Console.WriteLine("hello !"); } static void Add(int n,int m) { Console.WriteLine("MyDelegate1 Result:"+(m+n).ToString()); } static void M1(MyDelegate say)// { say(); }
上面运行的结果为
我们可以通过反编译来看看程序的内部实现
通过反编译我们可以看到委托继承自System.MulticastDelegate,而System.MulticastDelegate又继承自System.Delegate
说完委托,下面来说说事件。什么是事件?事件是对象发送的消息,发送信号通知用户操作。这个操作可能是由鼠标单击引起的,也可能是由某些其他的程序逻辑触发的。例如当点击按钮,弹出一个对话框时,用户出发的点击的事件,产生了相应的相应(弹出对话框)。那么委托和事件有什么区别呢?
private void Form1_Load(object sender, EventArgs e) { //自己定义一个登陆控件,在窗体加载的时候,myUser1注册一个事件 myUser1.newEvent += new Action<object, myneweventargs>(myUser1_newEvent); } //登陆校验 void myUser1_newEvent(object sender, myneweventargs e) { if (e.user == "admin" && e.pwd == "8888") { e.IsOk = true; } }
在编译后通过反射我们可以看到newEvent的内部实际上就是add与remove两个方法,事件的内部是靠委托来实现的
其实委托与事件没有太大的可比性,因为委托是一个类型,而事件是一个对象,事件的内部是通过委托来实现的,对于事件来说,内部的add与remove方法,所以事件只能通过“+=”来注册自己,或是“-=”来注销自己,外界不能主动触发事件,既事件是不能通过赋值来注册事件。