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 框架中的委托和事件
一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...
随机推荐
- django开发个人简易Blog——数据模型
提到数据模型,一定要说一下MVC,MVC框架是现代web开发中最流行的开发框架,它将数据与业务逻辑分开,减小了应用之间的高度耦合.个人非常喜欢MVC开发框架,除了具有上述特性,它使得web开发变得非常 ...
- 翻译-高效DevOps的10项实践
原文链接: http://www.drdobbs.com/architecture-and-design/top-10-practices-for-effective-devops/240149363 ...
- mac命令
mac下卸载nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}xc ...
- linux环境 c 中如何执行shell命令
1 system 相当简单: int system(const char *command); system("ps -aux"); 2 popen popen有两个参数,第一个是 ...
- Atitit apache 和guava的反射工具
Atitit apache 和guava的反射工具 apache1 Spring的反射工具类 ReflectionUtils1 Guava 反射工具2 apache 34 7 ...
- 从双十一战报看传统大家电如何O2O转型?
说到大家电电商,大家都会想起天猫.京东.苏宁易购.国美在线等各大电商平台,他们这一次的双十一又实现了较大规模的增长,而各大电商平台家电辉煌战绩的背后实际上是各大品牌家电的成功. 格力今年双十一当天创下 ...
- salesforce 零基础学习(三十五) 通过Process Builder和Approval Processes锁定记录(Lock Record)
有的时候我们可能有这样的需求,当某个字段为特定的值情况下,便锁定此条记录,仅允许Profile为System Admin的用户修改或者解锁,其他的用户只能查看此条记录,不能修改此条记录,这种情况下我们 ...
- app的同源和域的问题
app的同源和域的问题
- C 中读取键盘码
键盘码在底层开发中经常用到,有时候我们会忘记它们,就要急急忙忙的去找 键-码 对照表查看,其实程序可以自己打印出 键-码 对应值 #include <stdio.h> #include & ...
- JS中实现数组和对象的深拷贝和浅拷贝
数组的拷贝 > 数组的深拷贝,两层 var arr = [[1,2,3],[4,5,6],[7,8,9]]; var arr2 = []; 循环第一层数组 for(var i=0,len=arr ...