C#事件の.net下的EventArgs和EventHandler
事件参数(EventArgs)
.Net框架里边提供的一个委托EventHandler来Handle事件。
一样,搞一个场景(这个场景是书里的):买车。经销商(CarDealer)会上新车(NewCar)事件,这个事件会由买车的顾客(Comsumer)订阅,一旦有新车出来他们就会来光顾。在这里,由于需要详细的车的信息,所以使用前面提到的不带参数的方法就比较麻烦,我们重新定义一个委托(delegate)和事件参数(EventArgs)。
1、事件参数(CarInfoEventArgs)
从.Net提供的EventArgs里派生出来,包含车辆名字的属性

public class CarInfoEventArgs : EventArgs
{
public string Car { get; private set; } public CarInfoEventArgs(string car)
{
this.Car = car;
}
}

2、事件(NewCarInfo)
这里使用.Net自带的委托EventHandler来声明一个事件,相应的,这个事件的处理程序就必须使用这个委托对应的参数来构建
public event EventHandler<CarInfoEventArgs> NewCarInfo;
注意,这是一个泛型委托,在这里指定了参数的类型为CarInfoEventArgs,EventHandler的定义如下:
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
where TEventArgs : EventArgs
可以看到这个委托包含两个参数:一个object类型,一个泛型参数,并且这个泛型参数被限制为EventArgs或EventArgs派生的类型
3、完整的对象
CarDealer

public class CarDealer
{
public event EventHandler<CarInfoEventArgs> NewCarInfo; // 触发事件
public void NewCar(string car)
{
Console.WriteLine($"CarDealer, new car {car}");
if (NewCarInfo != null)
{
NewCarInfo(this, new CarInfoEventArgs(car));
}
}
}

Consumer

public class Consumer
{
public string Name { get; private set; } public Consumer(string name)
{
this.Name = name;
} public void NewCarIsHere(object sender, CarInfoEventArgs e)
{
Console.WriteLine($"{name}: car {e.Car} is new");
}
}

4、具体的实现

public class Program
{
static void Main()
{
var dealer = new CarDealer(); var michael = new Consumer("Michael");
dealer.NewCarInfo += michael.NewCarIsHere; dealer.NewCar("Mercedes"); var nick = new Consumer("Nick");
dealer.NewCarInfo += nick.NewCarIsHere; dealer.NewCar("Ferrari"); dealer.NewCarInfo -= michael.NewCarIsHere;
dealer.NewCar("Toyota");
}
}
C#事件の.net下的EventArgs和EventHandler的更多相关文章
- HTML 事件属性(下)
		HTML 事件属性(下) 一:键盘事件 (Keyboard Events)二:鼠标事件 (Mouse Events) 一:键盘事件 (Keyboard Events)在下列元素中无效:base.bdo ... 
- C# 委托和事件(二):使用.Net框架中的EventArgs和EventHandler
		前面一篇里提到事件是通过委托来进行关联的,而委托是可以带各种各样的参数的,其中就可以用事件参数(EventArgs),同时,也可以用.Net框架里边提供的一个委托EventHandler来Handle ... 
- 事件,使用.net自带委托EventHandler
		using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ... 
- C#基础加强篇—委托、Lambda表达式和事件(下)
		3.事件 事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互引起的,也可能是由某些其他的 ... 
- JQuery基础教程:事件(下)
		事件传播 为了说明不可单击的页面元素处理单击事件的能力,例如样式转换器中包含按钮的div元素或者兄弟元素h3,我们来实现一个鼠标指针进入元素和离开元素时的效果,首先需要添加一种翻转状态,表明 ... 
- c# 事件为何要继承EventArgs
		1:继承EventArgs是表示该类可作为事件,删掉了就默认继承object,没人会说你错 ----就是说事件不继承EventArgs 也没有错,也能正常运用,那么继承他的意义是什么呢?看2,3. 觉 ... 
- C#委托、事件剖析(下)
		本节对事件进行总结. 二.事件: 1.概念:Event:A member that enables an object or class to provide notifications;官方的解释是 ... 
- a标签包着img事件 ie下 a标签的click事件失效
		整个大的背景框有个点击事件, 如果标签结构是(详细的css样式略) a{background:green;} <a href=""> <img src=" ... 
- js基础 -----鼠标事件(按下 拖拽)
		<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
随机推荐
- 解决org.hibernate.HibernateException: identifier of an instance of com.ahd.entity.Order was altered from2 to 0
			错误信息 严重: Servlet.service() for servlet [springmvc] in context with path [/order] threw exception [Re ... 
- [leetcode]984. 不含 AAA 或 BBB 的字符串
			给定两个整数 A 和 B,返回任意字符串 S,要求满足: S 的长度为 A + B,且正好包含 A 个 'a' 字母与 B 个 'b' 字母: 子串 'aaa' 没有出现在 S 中: 子串 'bbb' ... 
- Java中重写与重载
			重写(覆盖):发生在子类与父类之间:方法名相同方法的个数.类型相同返回值类型小于等于父类的返回值类型 重载:发生在一个类中:方法名相同方法的个数.类型不同返回值类型可以相同也可以不相同 
- Android 常用数据操作封装类案例
			1.DbHelper类 继承自SQLiteOpenHelper类,实现对数据库的基本操作 package com.example.utils; import android.content.Conte ... 
- Python国内豆瓣源
			Python国内豆瓣源 https://pypi.doubanio.com/simple/ 
- next.js学习笔记
			github地址: https://github.com/zeit/next.js#fetching-data-and-component-lifecycle 简介 Next.js是一个用于React ... 
- 使用JAVA反射技术实现代码零耦合与功能无限扩展!
			1.反射使用的背景 最近在做一个功能,就是实现邮件发送功能,但是邮件发送有不同的内容和数据格式,在开始设计的时候直接将发送的内容写在了发送模块中,后来发现功能增加后,无法继续在里边写了,因为里边的功能 ... 
- Vue项目用于Ios和Android端开发
			起因 前公司商城App项目使用的是H5开发,有微信公众号.Ios和Android三个版本,H5版本是自己写的一套框架,已经用了有些年头了,承载不下不断涌现出的新需求.而Ios和Android端通过we ... 
- Java的优先级任务队列的实践
			队列的基本理解 在说队列之前说两个名词:Task是任务,TaskExecutor是任务执行器 而我们今天要说的队列就完全符合某机构这个情况,队列在有Task进来的时候TaskExecutor就立刻开始 ... 
- Java 时间总结
			转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80613024 本文出自[赵彦军的博客] 时区 整个地球分为二十四时区,每个时区都有 ... 
