使用C#的自定义事件
public class CarDealer
{
public Action<string> NewCarInfo; //使用系统定义的泛型委托 public void NewCarComing(string car)
{
Console.WriteLine("CarDealer, new car {0} has come.", car); if (NewCarInfo != null)
NewCarInfo(car);
}
}
先插入一段代码,这个例子的 Action<string> 表示只有一个 string 参数,如果有一组的参数的话,代码写起来会比较难看。
.Net 给我们提供了基于 EventArgs 来进行传参 的 自定义事件 EventHandler。
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
可以 EventHandler 理解为“发布者提供的订阅器”,"sender" 表示发布者,“e” 表示发布者推送给订阅者的参数信息。
而 EventArgs 则是 发布者 与 订阅者 间约定好的订阅信息。
来看完整的例子:
class Program
{
public class MyEventArg : EventArgs
{
public string name { get; set; } public MyEventArg(string carname)
{
name = carname;
}
} public class CarDealer
{
public event EventHandler<MyEventArg> NewCarInfo; public void NewCarComing(string carname)
{
Console.WriteLine("CarDealer, new car {0} has come.", carname); if (NewCarInfo != null)
NewCarInfo(this, new MyEventArg(carname));
}
} public class Consumer
{
private string name; public Consumer(string name)
{
this.name = name;
} public void NewCarIsHere(object sender, MyEventArg e)
{
Console.WriteLine("{0}, car {1} is new", name, e.name);
}
} static void Main(string[] args)
{
var dealer = new CarDealer();
var personA = new Consumer("personA");
dealer.NewCarInfo += personA.NewCarIsHere;
dealer.NewCarComing("Ferrari"); var personB = new Consumer("personB");
dealer.NewCarInfo += personB.NewCarIsHere;
dealer.NewCarComing("BMW"); Console.ReadLine();
}
}
个人不喜用“发布-订阅”模式来阐述,更偏向于用“通知-反馈”模式的流程 可加以总结了:
1. 定义一种事件或委托,同时约定好通知者要给反馈者的参数;
public class MyEventArg : EventArgs
{
public string name { get; set; } public MyEventArg(string carname)
{
name = carname;
}
} public class CarDealer
{
public event EventHandler<MyEventArg> NewCarInfo; public void NewCarComing(string carname)
{
Console.WriteLine("CarDealer, new car {0} has come.", carname); if (NewCarInfo != null)
NewCarInfo(this, new MyEventArg(carname));
}
}
2. 发布者提供事件通道 接受 反馈者按约定生成的反馈行为;
public class Consumer
{
private string name; public Consumer(string name)
{
this.name = name;
} public void NewCarIsHere(object sender, MyEventArg e)
{
Console.WriteLine("{0}, car {1} is new", name, e.name);
}
}
var dealer = new CarDealer();
var personA = new Consumer("personA");
dealer.NewCarInfo += personA.NewCarIsHere;
var personB = new Consumer("personB");
dealer.NewCarInfo += personB.NewCarIsHere;
3. 通知者发出通知,反馈者收到通知并做出反馈行为;
dealer.NewCarComing("Ferrari");
dealer.NewCarComing("BMW");
使用C#的自定义事件的更多相关文章
- 谈谈JS的观察者模式(自定义事件)
呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...
- Javascript之自定义事件
Javascript自定义事件,其本质就是观察者模式(又称订阅/发布模式),它的好处就是将绑定事件和触发事件相互隔离开,并且可以动态的添加.删除事件. 下面通过实例,一步一步构建一个具体的Javasc ...
- MUI APP关于页面之间的传值,plusready和自定义事件
最近在用MUI开发这个APP,发现有时候这个plusready不起作用,表现在,这个页面如果重复打开,这个plusready就进不去,然后上一个页面传过来的值,就没法接收了.这个经过MUI官方确认,是 ...
- 跟着《beginning jquery》学写slider插件并借助自定义事件改进它
<beginning jquery>是一本很不错的学习jquery的书,作者的讲解深入浅出,很适合初学者,在最后一章里面,作者把前面所有的点结合起来完成了一个轮播图的jquery插件.实现 ...
- cocos2d-x3.x自定义事件
-- 自定义事件 -- 监听: local eventDispatcher = self:getEventDispatcher();--self为继承Node的对象 local function ha ...
- HotApp小程序统计之自定义事件统计
什么是自定义事件统计 官网:https://weixin.hotapp.cn/document 自定事件,就是自定统计任意事件的执行,灵活度最高. 用上图的云笔记说明想知道如下信息 (1)多少 ...
- C#:委托和自定义事件
1. 委托概述 “委托”相当于C++中的“函数指针”,委托必须与所要“指向”的函数在“参数”和“返回类型”上保持一致; // 定义Person类 public class Person { publi ...
- 【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】
UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...
- CustomEvent自定义事件
javascript与HTML之间的交互是通过事件来实现的.事件,就是文档或浏览器窗口发生的一些特定的交互瞬间.通常大家都会认为事件是在用户与浏览器进行交互的时候触发的,其实通过javascript我 ...
- javascript事件之:谈谈自定义事件(转)
http://www.cnblogs.com/pfzeng/p/4162951.html 对于JavaScript自定义事件,印象最深刻的是用jQuery在做图片懒加载的时候.给需要懒加载的图片定义一 ...
随机推荐
- JDBC 之 事务
1.概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功. 2.数据库开启事务的命令dtl: Start transaction开启事务 Rollback回滚事务(撤销) ...
- pandas对象保存到mysql出错提示“BLOB/TEXT column used in key specification without a key length”解决办法
问题 将DataFrame数据保存到mysql中时,出现错误提示: BLOB/TEXT column used in key specification without a key length 原因 ...
- Discuz X2.5 用户名包含被系统屏蔽的字符[解决方法]
/uc_client/data/cache/badwords.php文件里的内容 删除并用 utf-8格式保存
- TeleMCU视频会议之Android版本号WebRTC client支持
本文原创自 http://blog.csdn.net/voipmaker 转载注明出处. 最新版本号TeleMCU 添加了Android手机端WebRTC视频会议能力,Android手机安装Chro ...
- 给想上MIT的牛学生说几句
[来信] 老师您好! 非常冒昧的来打搅您,仅仅是在学习上实在有些困惑才来向您求教一番. 我是计算机科学与技术的大一学生,我非常喜欢我自己的专业,可是学校里讲的东西太慢,太浅,所以我一般都是自学,我在自 ...
- Codeforces 437B The Child and Set
题目链接:Codeforces 437B The Child and Set 開始是想到了这样的情况,比方lowbit之后从大到小排序后有这么几个数,200.100,60.50.S = 210.那先选 ...
- 《Android开发艺术探索》读书笔记 (2) 第2章 IPC机制
2.1 Android IPC简介 (1)任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来 ...
- 图片预览(base64和blob:图片链接)和ajax上传、下载(带进度提示)
直接上代码 html和js <!DOCTYPE html> <html> <head> <meta name="viewport" con ...
- Android Studio学习随笔-基本事件(点击)
最常见的点击事件有三种创建方法,在MainActivity.java的onCreate函数(在启动程序是优先运行的程序)中创建setOnClickListener(动态运行)(最常见) protect ...
- 异步tcp通信——APM.ConsoleDemo
APM测试 俗话说麻雀虽小,五脏俱全.apm虽然简单,但是可以实现单机高性能消息推送(可以采用redis.kafka等改造成大型分布式消息推送服务器). 测试demo: using System; u ...