事件与委托的区别
电脑版发表于:2019/9/29 17:05
事件是一种特殊的委托实例,其实就是在委托的前面加上一个event关键字
加上了event后就会出现一个闪电的标识,闪电的标识就表示一个事件
例如:我们看看winfrom中按钮的点击事件:
发现了前面有一个event关键字,我们在看看EventHandler是个什么东东
可以看到其实就是一个委托而已,也就是证明了我们说的事件就是在委托前面加了一个event关键字
事件是有限制的委托实例
加上event后,限制了委托的使用
1:它只能+=或者-=
2:要执行这个委托在外面不能执行,无法破坏代码的封装性
例如我们自己实现一个定时器:
public class MyTimer { public event Action interval; public void Start(int timespan) { while (true) { if (interval != null) { interval(); System.Threading.Thread.Sleep(timespan); } } } }
调用:
static void Main(string[] args) { MyTimer mytime = new MyTimer(); mytime.interval += mytime_interval; mytime.Start(1000); Console.ReadLine(); } static void mytime_interval() { Console.WriteLine("国庆快乐"); }
效果如下:
这里如果里边把event关键字删除掉
结果不会用任何的变化,但是外面可以直接给它委托赋值而不必使用+=或者-=,还可以直接赋值
这样当然就不好了,会破坏代码内部的逻辑,事件应该是我们内部触发的而不是外部可以调用!
当然事件还是一种标准
上面那个定时器委托使用的是action其实不太好事件应该还是一种标准,是一个有两个参数一个返回值的委托,也就是事件源和事件参数,也就是名字叫EventHandler的委托
我们来实现一个猫叫了的事件,猫叫的原因有很多比如:饿了,想恋爱的等
public class Cat { public event EventHandler miao; public void Hungry() { CatEventArgs catEventArgs = new CatEventArgs(); catEventArgs.reason = "饿了"; miao(this, catEventArgs); } public void Love() { CatEventArgs catEventArgs = new CatEventArgs(); catEventArgs.reason = "想恋爱了"; miao(this, catEventArgs); } }
原因就用事件参数来实现:
public class CatEventArgs : EventArgs { public string reason { get; set; } }
调用:
static void Main(string[] args) { Cat cat = new Cat(); cat.miao += cat_miao; cat.Hungry(); cat.Love(); Console.ReadLine(); } static void cat_miao(object sender, EventArgs e) { CatEventArgs catEventArgs = e as CatEventArgs; Console.WriteLine("猫因为" + catEventArgs.reason + "叫了"); }
效果如下: