C# 委托和事件(一):最简单的委托和事件
C#的事件基于委托,所以先说委托。
一切脱离实际场景的抽象概念新手看上去就像是在扯犊子,不错,我就是个新手。所以我需要一个实际的场景。
明天刚好考试(商务英语),考试上有两个角色(class):老师(Teacher)和学生(Student),在考试时间终止的时候,老师会触发(invoke)一个事件(event):“考试时间到了,我tm要收卷子了!”(OnTestTimeUp),而每个学生都要订阅这个事件,并在这个事件发生的时候上交试卷(HandInTestPaper)。如果不用事件的话,老师在时间结束的时候就要调用每个学生的的HandInTestPaper方法,如果使用事件,只要在学生被实例化的时候在事件上增加一个订阅即可。
1、老师和学生之间的桥梁
老师和学生之间的桥梁用委托来完成,这里就用最简单的一种委托:没有返回、没有参数、不支持泛型:
public delegate void TestTimeUpHandler();
接着,用这个委托定义一个事件,这样学生就可以订阅这个事件
public event TestTimeUpHandler TestTimeUp;
学生订阅事件后,当老师触发这个事件的时候,学生就会做出一些响应
public void OnTestTimeUp() { TestTimeUp?.Invoke(); }
2、学生如何订阅?
首先回到刚才的委托,这个委托非常简单,没有返回、没有参数,所以学生类中只要有一个方法,签名与这个一致就可以订阅这个事件:
public void HandInTestPaper() { Console.WriteLine("The test paper has been handed in."); }
然后在实例化后直接将这个方法订阅给事件即可
3、两边的关系
4、完整的例子
Delegate
/// <summary> /// 委托,考试时间到的Handler /// </summary> public delegate void TestTimeUpHander();
Teacher
/// <summary> /// 教师类 /// </summary> public class Teacher { public event TestTimeUpHander TestTimeUp; public void OnTestTimeUp() { TestTimeUp?.Invoke(); } }
Student
/// <summary> /// 学生类 /// </summary> public class Student { public string Name { get; private set; } public Student(string name) { this.Name = name; } public void HandInTestPaper() { Console.WriteLine($"{this.Name}\' paper has been handed in"); } }
5、具体场景实现
public class Program { public static void Main() { Teacher teacher = new Teacher(); var tom = new Student("Tom"); var jerry = new Student("Jerry"); var spark = new Student("Spark"); var tyke = new Student("Tyke"); // 订阅teacher的TestTimeUp事件 teacher.TestTimeUp += tom.HandInTestPaper; teacher.TestTimeUp += jerry.HandInTestPaper; // invoke TestTimeUp 事件 teacher.OnTestTimeUp(); Console.WriteLine(); teacher.TestTimeUp -= tom.HandInTestPaper; teacher.TestTimeUp += tyke.HandInTestPaper;
teacher.OnTestTimeUp(); Console.ReadKey(); } }
运行的结果如下:
可以看到,第一次触发事件的时候,只有Tom和Jerry两个订阅了事件的实例执行了HandInTestPaper方法,第二次触发事件前,移除了Tom的订阅,同时增加了Tyke的订阅,所以Jerry和Tyke执行了HandInTestPaper方法。
以上,是最简单的C#委托与事件的实现,复杂的方法日后再说
C# 委托和事件(一):最简单的委托和事件的更多相关文章
- 【转】C# 中的委托和事件
阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...
- 《C#高级编程》学习笔记------C#中的委托和事件(续)
本文转载自张子阳 目录 为什么要使用事件而不是委托变量? 为什么委托定义的返回值通常都为void? 如何让事件只允许一个客户订阅?(事件访问器) 获得多个返回值与异常处理 委托中订阅者方法超时的处理 ...
- C#中的委托和事件(续)
转自张子阳的博客http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-Advanced.aspx 引言 如果你看过了 C#中 ...
- .NET之美——C#中的委托和事件(续)
C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为 ...
- C#中的委托和事件2-2(转)
引言 如果你看过了 C#中的委托和事件2-1 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些 ...
- 转:C#中的委托和事件(续)
引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常 ...
- C#中的委托和事件(二)
引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常 ...
- [转]C#中的委托和事件(续)
源码下载:http://www.tracefact.net/SourceCode/MoreDelegate.rar C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托 ...
- Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件
一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...
随机推荐
- JavaScript思维导图—正则表达式
JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/
- shell脚本常规技巧
邮件相关 发送邮件: #!/usr/bin/python import sys; import smtplib; from email.MIMEText import MIMEText mail_ho ...
- [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法
在调试一个自己做的手环,每次用keil烧写好程序运行的蓝牙.陀螺仪都是正常的.但是掉电再上电之后蓝牙是好的.陀螺仪可以读出ID但是读出的加速度和角速度数据全为0. 下面是发生问题时main函数的前面部 ...
- 微软承诺将在今年的 Visual C++ 更新中加入 Clang 编译器
微软最近发布将在2015年11月 Visual C++ 更新中加入 Clang 编译器 ,Clang 开源编译器以相比GCC更快的编译速度和更优的错误提示著称. Clang关于C,C++,及Objec ...
- flex Vector
Error: 找不到类型,或者它不是编译时常数: Vector. 或者Type was not found or was not a compile-time constant: Vector. ...
- 使用SqlBulkCopy类来批量复制数据
DataTable dt = new DataTable(); dt.Columns.Add("id", typeof(string)); ; i < ; i++) { Da ...
- Oracle增删改DML脚本记录
--insert into添加数据 ','王军','男'); --提交事物 commit; --回滚事物 --rollback; insert into teacher1 select * from ...
- PHP数据库操作:使用ORM
之前我发了一篇博文PHP数据库操作:从MySQL原生API到PDO,向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对象.PDO操作MySQL数据库的.本文介绍如 ...
- angular的$resource factory都有啥
angular的$resource factory都有啥 A factory which creates a resource object that lets you interact with R ...
- VS 添加Snippets
Code Snippet 下载文件: propfull.7z copy到C:\Users\哲\Documents\Visual Studio 2013\Code Snippets\Visual C#\ ...