应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

事件与委托的区别

8085人阅读 2019/9/29 17:05 总访问:5182442 评论:0 收藏:0 手机
分类: .NET


事件是一种特殊的委托实例,其实就是在委托的前面加上一个event关键字

加上了event后就会出现一个闪电的标识,闪电的标识就表示一个事件


例如:我们看看winfrom中按钮的点击事件:

发现了前面有一个event关键字,我们在看看EventHandler是个什么东东

可以看到其实就是一个委托而已,也就是证明了我们说的事件就是在委托前面加了一个event关键字


事件是有限制的委托实例

加上event后,限制了委托的使用

1:它只能+=或者-=

2:要执行这个委托在外面不能执行,无法破坏代码的封装性


例如我们自己实现一个定时器:

  1. public class MyTimer
  2. {
  3.     public event Action interval;
  4.     public void Start(int timespan)
  5.     {
  6.         while (true)
  7.         {
  8.             if (interval != null)
  9.             {
  10.                 interval();
  11.                 System.Threading.Thread.Sleep(timespan);
  12.             }
  13.         }
  14.     }
  15. }

  调用:

  1. static void Main(string[] args)
  2. {
  3.     MyTimer mytime = new MyTimer();
  4.     mytime.interval += mytime_interval;
  5.     mytime.Start(1000);
  6.     Console.ReadLine();
  7. }
  8. static void mytime_interval()
  9. {
  10.     Console.WriteLine("国庆快乐");
  11. }

效果如下:

这里如果里边把event关键字删除掉

结果不会用任何的变化,但是外面可以直接给它委托赋值而不必使用+=或者-=,还可以直接赋值

这样当然就不好了,会破坏代码内部的逻辑,事件应该是我们内部触发的而不是外部可以调用!



当然事件还是一种标准

上面那个定时器委托使用的是action其实不太好事件应该还是一种标准,是一个有两个参数一个返回值的委托,也就是事件源和事件参数,也就是名字叫EventHandler的委托

我们来实现一个猫叫了的事件,猫叫的原因有很多比如:饿了,想恋爱的等

  1. public class Cat
  2. {
  3.     public event EventHandler miao;
  4.     public void Hungry()
  5.     {
  6.         CatEventArgs catEventArgs = new CatEventArgs();
  7.         catEventArgs.reason = "饿了";
  8.         miao(this, catEventArgs);
  9.     }
  10.     public void Love()
  11.     {
  12.         CatEventArgs catEventArgs = new CatEventArgs();
  13.         catEventArgs.reason = "想恋爱了";
  14.         miao(this, catEventArgs);
  15.     }
  16. }

原因就用事件参数来实现:

  1. public class CatEventArgs : EventArgs
  2. {
  3.     public string reason { getset; }
  4. }

调用:

  1. static void Main(string[] args)
  2. {
  3.     Cat cat = new Cat();
  4.     cat.miao += cat_miao;
  5.     cat.Hungry();
  6.     cat.Love();
  7.     Console.ReadLine();
  8. }
  9. static void cat_miao(object sender, EventArgs e)
  10. {
  11.     CatEventArgs catEventArgs = e as CatEventArgs;
  12.     Console.WriteLine("猫因为" + catEventArgs.reason + "叫了");
  13. }

效果如下:



欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

饰心

2020/7/2 13:58:33

[哈哈][哈哈][哈哈][哈哈][哈哈]

剑轩:@饰心无法接受.jpg(假装有表情)

2020/7/2 14:36:36 回复