C#中事件流程的简单理解
C#中事件流程的简单理解
C#中事件基于委托,要理解事件要先理解委托,但是现在我还没想好怎么写委托,如果不懂委托可以先找找委托的文章
事件基于委托,为委托提供了一种发布/订阅机制
一上来就是这句话,很容易就懵了,我们先不管这句话,直接看例子
public class CarInfoEventArgs : EventArgs
{
public CarInfoEventArgs(string car) => Car = car;
public string Car { get; }
}
首先我们定义了一个类CarInfoEventArgs
继承自EventArgs
类,定义了一个构造函数和一个只读属性,其实这个类是不重要的
我们看下一个类
public class CarDealer
{
public event EventHandler<CarInfoEventArgs> NewCarInfo;
public void NewCar(string car)
{
Console.WriteLine($"CarDealer, new car {car}");
NewCarInfo?.Invoke(this, new CarInfoEventArgs(car));
}
}
在这个类中,使用event
关键字定义了NewCarInfo
事件
事件基于委托,NewCarInfo
事件也是NewCarInfo
委托,是EventHandler<T>
类型的委托实例
然后定义了一个NewCar
方法,调用NewCar
时当NewCarInfo
不为null时触发事件NewCarInfo
我当时在这里卡了很久,为什么是NewCarInfo?.Invoke(this, new CarInfoEventArgs(car))
触发事件,其实是我蠢了,NewCarInfo.Invoke(this, new CarInfoEventArgs(car))
和NewCarInfo(this, new CarInfoEventArgs(car))
完全相同,学委托的时候忘了这一点,导致Invoke
半天不知道什么意思
下面再定义一个Consumer类
public class Consumer
{
private string _name;
public Consumer(string name) => _name = name;
public void NewCarIsHere(object sender, CarInfoEventArgs e) =>
Console.WriteLine($"{_name}: car {e.Car} is new");
}
Consumer
类定义了一个方法NewCarIsHere
这个方法的作用我们也不细说,接下来看重点
static void Main()
{
var dealer = new CarDealer();
var valtteri = new Consumer("Valtteri");
var max = new Consumer("Max");
dealer.NewCarInfo += valtteri.NewCarIsHere;
dealer.NewCarInfo += max.NewCarIsHere;
dealer.NewCar("Williams");
dealer.NewCar("Mercedes");
dealer.NewCarInfo -= valtteri.NewCarIsHere;
dealer.NewCar("Ferrari");
}
在Main方法中声明了两个Consumer
类的实例valtteri
和max
声明了一个CarDealer
类的实例dealer
从上面CarDealer
类的定义我们知道,dealer
有一个NewCarInfo
的委托,有一个NewCar
的方法
dealer.NewCarInfo += valtteri.NewCarIsHere;
dealer.NewCarInfo += max.NewCarIsHere;
这两行代码为dealer
的NewCarInfo
委托添加了两个方法引用,即调用NewCarInfo
委托时会执行这两个方法,这就是发布/订阅机制中的订阅
当调用dealer.NewCar
方法时,就会触发NewCarInfo
事件/委托,然后就会执行valtteri.NewCarIsHere
和max.NewCarIsHere
方法
我整理了一下,大概流程就是这个样子:
一、有一个类创建了一个事件,定义了触发事件的方法(CarDealer
)
二、其他方法添加到事件委托中
dealer.NewCarInfo += valtteri.NewCarIsHere;
dealer.NewCarInfo += max.NewCarIsHere;
三、在合适的时候触发事件,事件委托会执行添加到事件委托的其他方法
订阅者给出一个联系我的方法,然后注册到事件委托中,触发事件后事件委托调用订阅者给出的联系方法
写得不好的地方,请批评指正
wujuncheng10@163.com
注:本文中代码示例来自《C#高级编程(第11版)
C#中事件流程的简单理解的更多相关文章
- 对touch事件传递的简单理解
对View事件传递的理解.看的这篇. 对事件传递有了大致的了解. onInterceptTouchEvent 函数决定是否将事件拦截,拦截之后,该控件的全部子控件接收不到这个事件.onTouchEve ...
- python中实例方法,类方法,静态方法简单理解
按照字面名称来理解的话: 实例方法就是实例化对象的方法,绑定在实例对象上 类方法就是类自己的方法,不需要实例化对象,类自己就是对象,直接绑定在类上 静态方法就是普通的函数,函数作为对象,不过是封装在类 ...
- JavaScript中this指向的简单理解
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
- JS中的 new 操作符简单理解
首先上一一个简单的 new 操作符实例 var Person = function(name){ this.name = name; this.say = function(){ return &qu ...
- 个人对Java中多态的一些简单理解
什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...
- Java中多态的一些简单理解
什么是多态 .面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. .多态的定义:指允许不同类的对象对同一消息做出响应.即 ...
- 转:spring中InitailizingBean接口的简单理解
转自:https://www.cnblogs.com/wxgblogs/p/6849782.html spring中InitializingBean接口使用理解 InitializingBean接 ...
- SQL中锁表语句简单理解(针对于一个表)
锁定数据库的一个表 复制代码代码如下: SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 复制代码代码如下: SELECT * FROM tab ...
- HTTP协议中的COOKIE机制简单理解
1.为什么会有COOKIE这种机制 首先一种场景, 在一个网站上面, 我发起一次请求,那服务器怎么知道我是谁?是谁发起的这次请求呢, HTTP协议是无状态的协议, 浏览器的每一次请求,服务器都当做一次 ...
随机推荐
- Codeforces Round #643 (Div. 2) D. Game With Array (思维,构造)
题意:给你两个正整数\(N\)和\(S\),构造一个长度为\(N\)并且所有元素和为\(S\)的正整数数组,问是否能找到一个\(K (0\le K \le S)\)使得这个数组的任意_子数组_的和都不 ...
- Codeforces Round #651 (Div. 2) A. Maximum GCD (思维)
题意:在\(1\)~\(n\)中找两个不相等的数使得他们的\(gcd\)最大. 题解:水题,如果\(n\)是偶数,那么一定取\(n\)和\(n/2\),\(n\)是奇数的话,取\(n-1\)和\((n ...
- [Golang]-5 协程、通道及其缓冲、同步、方向和选择器
目录 协程 通道 通道缓冲 通道同步 通道方向 通道选择器 协程 Go 协程 在执行上来说是轻量级的线程. 代码演示 import ( "fmt" "time" ...
- python = 赋值顺序 && C++ side effect
title: python = 赋值顺序 && C++ side effect date: 2020-03-17 15:00:00 categories: [python][c++] ...
- 图像处理中Stride的理解
一行有 11 个像素(Width = 11), 对一个 32 位(每个像素 4 字节)的图像, Stride = 11 * 4 = 44. 但还有个字节对齐的问题, 譬如: 一行有 11 个像素(Wi ...
- tensorflow加载ckpt出错
Issue链接 问题: tensorflow加载ckpt出错 此处原因: 该ckpt文件对应的tensorflow版本过老, 其中的部分内置变量名发生了改变. 提示: Key lstm_o/bidir ...
- Git常用命令速查表 & Git Basics & github : release 发布!
Git常用命令速查表 & Git Basics & github : release 发布! Git常用命令速查表: 1 1 1 1 1 http://git-scm.com/bo ...
- Google Chrome All In One
Google Chrome All In One Chrome Experiments Chrome 测试版 Chrome 开发者版 Chrome Canary 版 chrome://welcome/ ...
- jest all in one
jest all in one ES Modules & TypeScript & React https://github.com/xgqfrms/FEAT/tree/master/ ...
- Learning web development with MDN
Learning web development with MDN Server-side website programming Dynamic Websites – Server-side pro ...