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类的实例valtterimax

声明了一个CarDealer类的实例dealer

从上面CarDealer类的定义我们知道,dealer有一个NewCarInfo的委托,有一个NewCar的方法

dealer.NewCarInfo += valtteri.NewCarIsHere;
dealer.NewCarInfo += max.NewCarIsHere;

这两行代码为dealerNewCarInfo委托添加了两个方法引用,即调用NewCarInfo委托时会执行这两个方法,这就是发布/订阅机制中的订阅

当调用dealer.NewCar方法时,就会触发NewCarInfo事件/委托,然后就会执行valtteri.NewCarIsHeremax.NewCarIsHere方法


我整理了一下,大概流程就是这个样子:

一、有一个类创建了一个事件,定义了触发事件的方法(CarDealer

二、其他方法添加到事件委托中

dealer.NewCarInfo += valtteri.NewCarIsHere;
dealer.NewCarInfo += max.NewCarIsHere;

三、在合适的时候触发事件,事件委托会执行添加到事件委托的其他方法

订阅者给出一个联系我的方法,然后注册到事件委托中,触发事件后事件委托调用订阅者给出的联系方法


写得不好的地方,请批评指正

wujuncheng10@163.com

注:本文中代码示例来自《C#高级编程(第11版)

C#中事件流程的简单理解的更多相关文章

  1. 对touch事件传递的简单理解

    对View事件传递的理解.看的这篇. 对事件传递有了大致的了解. onInterceptTouchEvent 函数决定是否将事件拦截,拦截之后,该控件的全部子控件接收不到这个事件.onTouchEve ...

  2. python中实例方法,类方法,静态方法简单理解

    按照字面名称来理解的话: 实例方法就是实例化对象的方法,绑定在实例对象上 类方法就是类自己的方法,不需要实例化对象,类自己就是对象,直接绑定在类上 静态方法就是普通的函数,函数作为对象,不过是封装在类 ...

  3. JavaScript中this指向的简单理解

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  4. JS中的 new 操作符简单理解

    首先上一一个简单的 new 操作符实例 var Person = function(name){ this.name = name; this.say = function(){ return &qu ...

  5. 个人对Java中多态的一些简单理解

    什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...

  6. Java中多态的一些简单理解

    什么是多态 .面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. .多态的定义:指允许不同类的对象对同一消息做出响应.即 ...

  7. 转:spring中InitailizingBean接口的简单理解

    转自:https://www.cnblogs.com/wxgblogs/p/6849782.html spring中InitializingBean接口使用理解   InitializingBean接 ...

  8. SQL中锁表语句简单理解(针对于一个表)

    锁定数据库的一个表 复制代码代码如下: SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 复制代码代码如下: SELECT * FROM tab ...

  9. HTTP协议中的COOKIE机制简单理解

    1.为什么会有COOKIE这种机制 首先一种场景, 在一个网站上面, 我发起一次请求,那服务器怎么知道我是谁?是谁发起的这次请求呢, HTTP协议是无状态的协议, 浏览器的每一次请求,服务器都当做一次 ...

随机推荐

  1. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维,模拟栈)

    题意:给你一串括号,每次仅可以修改一个位置,问有多少位置仅修改一次后所有括号合法. 题解:我们用栈来将这串括号进行匹配,每成功匹配一对就将它们消去,因为题目要求仅修改一处使得所有括号合法,所以栈中最后 ...

  2. String常用方法介绍

    转载 int length(); 语法:字符串变量名.length(); 返回值为 int 类型.得到一个字符串的字符个数(中.英.空格.转义字符皆为字符,计入长度). String a=" ...

  3. 02、scrapy安装

    1.安装scrapy 采用pip的安装方式,从豆瓣源获取 pip install -i https://pypi.douban.com/simple/ scrapy 安装过程中会报出错误: build ...

  4. ssh配置方面小实验①

    注意:sshd_config配置文件有些特殊:注释掉的选项,并不是不生效的,而是默认生效选项.使用某选项时,要先取消注释,再修改为yes或no关于效率和安全的说明:安全:telnet < ssh ...

  5. C++实现二叉树的基本操作:建立、遍历、计算深度、节点数、叶子数等

    题意: 代码实现: #include<iostream> #include<queue> #include<stack> using namespace std; ...

  6. python自动化运维之CMDB篇-大米哥

    python自动化运维之CMDB篇 视频地址:复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1Oj_sglTi2P1CMjfMkYKwCQ  ...

  7. Redis 穿透 & 击穿 & 雪崩

    原文:https://www.cnblogs.com/binghe001/p/13661381.html 缓存穿透 如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数 ...

  8. Excel导出时设置单元格的格式为文本

    问题: 用excel导出数据时,如何设置单元格格式的数字分类为"文本",默认是"常规"? 比如:导出编码0235A089,在Excel查看默认显示的是没有前面的 ...

  9. 编程方式建视频——GitHub 热点速览 v.21.07

    作者:HelloGitHub-小鱼干 假期过半,大家过得如何,吃好喝好了吗?GitHub 很好!本周的 GitHub Trending 又上爆款项目--github1s 装完之后,一秒 GitHub ...

  10. Python+OpenCV+图片旋转并用原底色填充新四角

    import cv2 from math import fabs, sin, cos, radians import numpy as np from scipy.stats import mode ...