C#事件2
今天又来说一下C#中的事件,为什么会有这个又呢?一个是因为以前写过一篇关于事件的东西,二来呢是因为感觉接口这个东西完全可以替换委托来写事件。因为这两个方面的原因,重新过了一遍C#中的事件。
事件这个东西C#中定义事件的是EventHandler这个委托,所以呢我们暂且按照C#这个模式写一个简单的事件,代码如下:
这个类很简单,一个汽车类,包含一个字段,以及其相应的属性,然后是构造方法,接下来是核心代码:定义了一个事件run,就是汽车跑起来的事件,然后定义了一个go方法这个go方法用于触发这个run事件。
接下来我们定义了一个类来订阅这个run事件,如下:
这个类蛮好玩的,首先是字段和属性,分别是人的名字的人的汽车,然后是构造函数,构造函数注意一下第四行,这个地方是订阅了这个事件,这个事件的具体实现是在human中的doSthWhenCarRun()方法中来具体定义的。
好的废话不多说我们来看一下Main方法,然后来运行这个Console程序:
VeryVeryEasy的主函数,局势实例化了一个human,然后触发了human.Car的run事件。OK我们来看一下运行后的结果:
非常非常的简单的一个小程序。但是分析起来还是有好多想说的,那么下面我就来说一下:
这个Car呢,我们可以类比为我们平时写程序中的Button、Label、TextView、ComboBox、DropdownList、DataGridView、Gridview、CheckBox等等定义好的那些控件,Car中的run事件就相当于Button中的Click、TextView中的TextChanged、TextChanging(可能没有)、或者Combobox中的SelectedIndexChanged事件等等,无外乎触发的方法不同,Button用的捕获鼠标的点击,我们Car用的是go方法而已。理解了这个可以说就理解了这篇文章的50%;
接下来我们再看一下接下来的50%是什么------它就是我们的human类,human类跟我们平时用的什么类似呢?相当于我们WinForm中的Form、WebPage中的Page、WebForm中的Form,我们在创建一个窗体之后,我们肯定会拖动过来几个控件,这个过程可以说就是跟自己在human类中写一个Car是一样子的,不过是宇宙级的VisualStudio将这个写控件的事情编程了拖动,让我们更轻松的实现了。然后我们有了窗体,有了控件我们肯定会给窗体加几个事件,加事件也蛮简单:选中控件在属性列表中找到事件列表的选项卡,在改选项卡中选中指定的事件双击就可以了。这个同样是宇宙IDE给我们的便利,我们自己写代码则需要如上面我写的那样使用+=来注册一个事件了。最后要讲的是我上面的这个doSthWhenCarRun()这个方法是不是看着很眼熟啊?是的方法签名跟我们写Click啊、changed啊等等事件都是一样的,只不过我们平时都称他们是事件体,是的他们不是事件,他们本质上是一个方法。
至此,100%的核心知识点讲完了。不得不说宇宙级的IDE就是宇宙级的IDE,微软这个做的确实蛮屌的,不论是使用人数很多的Eclipse、收费的各种Storm,都没有这种拖动实现的便捷功能。要说的AndroidStudio做的也有这个拖动的功能,蛮厉害的。
最后的最后,回答一个上面我提到的用接口可不可以写出事件的功能呢?我的答案是Yes,接下来我将粘贴改造后用接口实现的新的Car类,如下:
接下来看一下改写后的human2类,如下:
在Main方法中调用,如下:
我们看一下运行的结果:
哇哦-----真的完全一样唉!
至此本来应该结束了,但是呢好不容易写了这么牛X的一个东西,还想啰嗦几句:我们看新闻的时候总是听到说要增强四个自信,哪四个自信呢:社会主义的理论道路自信、理论自信、制度自信、文化自信,我们搞C#的也一样要增强我们的四个自信:C#语言自信、理论自信、IDE自信、文化自信,祝愿C#的明天更美好!
最新文章
- SQL Server自动化运维系列——关于邮件通知那点事(.Net开发人员的福利)
- Jacobian矩阵和Hessian矩阵
- PageBase
- gettimeofday() 获取系统时间,精确到微秒 这个似乎只能在linux 下用,不能在windows 下用
- Spark Streaming揭秘 Day14 State状态管理
- openCV 直方图统计
- 我所理解的 KMP(Knuth–Morris–Pratt) 算法
- css hack 大全
- dubbo架构演变之路
- quillJS 富文本编辑器源码分析系列1
- Jmeter学习系列----3 配置元件之计数器
- Operation not allowed on a unidirectional dataset错误?
- [国家集训队] Crash 的文明世界
- linux终端提示符显示bash-4.2#
- Django之模型层(多表操作)
- 转://Oracle补丁及opatch工具介绍
- Ubuntu下Apache虚拟主机+反向代理
- Ubuntu安装Gogs服务
- 哥java学识有大进 干回之前的小学生系统像切菜一样简单 不说了 来代码
- docker——三剑客之Docker Compose
热门文章
- 算法(Algorithms)第4版 练习 1.3.3
- python中字符串使用需要注意的地方
- vs2015配置boost c++
- Angular Js 控制器
- java支付宝开发-异常-01-";sub_code";:";isv.invalid-app-id";,";sub_msg";:";无效的AppID参数";
- hbase_异常_02_hbase无法访问16010端口
- nodejs stream &; buffer 互相转换
- Android数据传递的五种方法汇总
- 省选/NOI刷题Day2
- Gym - 100801D:Distribution in Metagonia (数学)