十三、C# 事件
class Program
{
static void Main(string[] args)
{
//连接发布者和订阅者
Thermostat tm = new Thermostat();
Cooler cl = new Cooler();
Heater ht = new Heater();
//设置委托变量关联的方法。+=可以存储多个方法,这些方法称为订阅者。
tm.OnTemperatureChange += cl.OnTemperatureChanged;
tm.OnTemperatureChange += ht.OnTemperatureChanged;
string temperature = Console.ReadLine(); //将数据发布给订阅者(本质是依次运行那些方法)
tm.OnTemperatureChange(float.Parse(temperature)); Console.ReadLine(); }
}
//两个订阅者类
class Cooler
{
public Cooler(float temperature)
{
_Temperature = temperature;
}
private float _Temperature;
public float Temperature
{
set
{
_Temperature = value;
}
get
{
return _Temperature;
}
} //将来会用作委托变量使用,也称为订阅者方法
public void OnTemperatureChanged(float newTemperature)
{
if (newTemperature > _Temperature)
{
Console.WriteLine("Cooler:on ! ");
}
else
{
Console.WriteLine("Cooler:off ! ");
}
}
}
class Heater
{
public Heater(float temperature)
{
_Temperature = temperature;
}
private float _Temperature;
public float Temperature
{
set
{
_Temperature = value;
}
get
{
return _Temperature;
}
}
public void OnTemperatureChanged(float newTemperature)
{
if (newTemperature < _Temperature)
{
Console.WriteLine("Heater:on ! ");
}
else
{
Console.WriteLine("Heater:off ! ");
}
}
} //发布者
class Thermostat
{ //定义一个委托类型
public delegate void TemperatureChangeHanlder(float newTemperature);
//定义一个委托类型变量,用来存储订阅者列表。注:只需一个委托字段就可以存储所有订阅者。
private TemperatureChangeHanlder _OnTemperatureChange;
//现在的温度
private float _CurrentTemperature; public TemperatureChangeHanlder OnTemperatureChange
{
set { _OnTemperatureChange = value; }
get { return _OnTemperatureChange; }
} public float CurrentTemperature
{
get { return _CurrentTemperature;}
set
{
if (value != _CurrentTemperature)
{
_CurrentTemperature = value;
}
}
}
}
public float CurrentTemperature
{
get { return _CurrentTemperature; }
set
{
if (value != _CurrentTemperature)
{
_CurrentTemperature = value;
OnTemperatureChange(value);
}
}
}
public float CurrentTemperature
{
get { return _CurrentTemperature; }
set
{
if (value != _CurrentTemperature)
{ _CurrentTemperature = value;
TemperatureChangeHanlder localOnChange = OnTemperatureChange;
if (localOnChange != null)
{
//OnTemperatureChange = null;
localOnChange(value);
} }
}
}
Thermostat.TemperatureChangeHanlder delegate1;
Thermostat.TemperatureChangeHanlder delegate2;
Thermostat.TemperatureChangeHanlder delegate3;
delegate3 = tm.OnTemperatureChange;
delegate1 = cl.OnTemperatureChanged;
delegate2 = ht.OnTemperatureChanged;
delegate3 += delegate1;
delegate3 += delegate2;
Thermostat.TemperatureChangeHanlder delegate1;
Thermostat.TemperatureChangeHanlder delegate2;
Thermostat.TemperatureChangeHanlder delegate3;
delegate1 = cl.OnTemperatureChanged;
delegate2 = ht.OnTemperatureChanged;
delegate3 = delegate1 + delegate2;
delegate3 = delegate3 - delegate2;
tm.OnTemperatureChange = delegate3;
public float CurrentTemperature
{
get { return _CurrentTemperature; }
set
{
if (value != _CurrentTemperature)
{ _CurrentTemperature = value;
TemperatureChangeHanlder localOnChange = OnTemperatureChange;
if (localOnChange != null)
{
foreach (TemperatureChangeHanlder hanlder in localOnChange.GetInvocationList())
{
try
{
hanlder(value);
}
catch (Exception e)
{
Console.WriteLine(e.Message); }
}
} }
}
}
public class Thermostat
{
private float _CurrentTemperature;
public float CurrentTemperature
{
set { _CurrentTemperature = value; }
get { return _CurrentTemperature; }
}
//定义委托类型
public delegate void TemperatureChangeHandler(object sender, TemperatureArgs newTemperatrue); //定义一个委托变量,并用event修饰,被修饰后有一个新的名字,事件发布者。
public event TemperatureChangeHandler OnTemperatureChange = delegate { }; public class TemperatureArgs : System.EventArgs
{
private float _newTemperature;
public float NewTemperature
{
set { _newTemperature = value; }
get { return _newTemperature; }
}
public TemperatureArgs(float newTemperature)
{
_newTemperature = newTemperature;
} }
}
class Program
{
static void Main(string[] args)
{
Thermostat tm = new Thermostat(); Cooler cl = new Cooler();
Heater ht = new Heater(); //设置订阅者(方法)
tm.OnTemperatureChange += cl.OnTemperatureChanged;
tm.OnTemperatureChange += ht.OnTemperatureChanged; tm.CurrentTemperature = ;
}
}
//发布者类
public class Thermostat
{
private float _CurrentTemperature;
public float CurrentTemperature
{
set
{
if (value != _CurrentTemperature)
{
_CurrentTemperature = value;
if (OnTemperatureChange != null)
{
OnTemperatureChange(this, new TemperatureArgs(value));
} }
}
get { return _CurrentTemperature; }
}
//定义委托类型
public delegate void TemperatureChangeHandler(object sender, TemperatureArgs newTemperatrue); //定义一个委托变量,并用event修饰,被修饰后有一个新的名字,事件发布者。
public event TemperatureChangeHandler OnTemperatureChange = delegate { }; //用来给事件传递的数据类型
public class TemperatureArgs : System.EventArgs
{
private float _newTemperature;
public float NewTemperature
{
set { _newTemperature = value; }
get { return _newTemperature; }
}
public TemperatureArgs(float newTemperature)
{
_newTemperature = newTemperature;
} }
} //两个订阅者类
class Cooler
{
public Cooler(float temperature)
{
_Temperature = temperature;
}
private float _Temperature;
public float Temperature
{
set
{
_Temperature = value;
}
get
{
return _Temperature;
}
} //将来会用作委托变量使用,也称为订阅者方法
public void OnTemperatureChanged(object sender, Thermostat.TemperatureArgs newTemperature)
{
if (newTemperature.NewTemperature > _Temperature)
{
Console.WriteLine("Cooler:on ! ");
}
else
{
Console.WriteLine("Cooler:off ! ");
}
}
}
class Heater
{
public Heater(float temperature)
{
_Temperature = temperature;
}
private float _Temperature;
public float Temperature
{
set
{
_Temperature = value;
}
get
{
return _Temperature;
}
}
public void OnTemperatureChanged(object sender, Thermostat.TemperatureArgs newTemperature)
{
if (newTemperature.NewTemperature < _Temperature)
{
Console.WriteLine("Heater:on ! ");
}
else
{
Console.WriteLine("Heater:off ! ");
}
}
}
//定义委托类型
public delegate void TemperatureChangeHandler(object sender, TemperatureArgs newTemperatrue); //定义一个委托变量,并用event修饰,被修饰后有一个新的名字,事件发布者。
public event TemperatureChangeHandler OnTemperatureChange = delegate { }; 在编译器的作用下,会自动扩展成:
private TemperatureChangeHandler _OnTemperatureChange = delegate { }; public void add_OnTemperatureChange(TemperatureChangeHandler handler)
{
Delegate.Combine(_OnTemperatureChange, handler);
}
public void remove_OnTemperatureChange(TemperatureChangeHandler handler)
{
Delegate.Remove(_OnTemperatureChange, handler);
}
public event TemperatureChangeHandler OnTemperatureChange
{
add
{
add_OnTemperatureChange(value);
} remove
{
remove_OnTemperatureChange(value);
} }
protected TemperatureChangeHandler _OnTemperatureChange = delegate { };
public event TemperatureChangeHandler OnTemperatureChange
{
add
{
//此处代码可以自定义
Delegate.Combine(_OnTemperatureChange, value);
}
remove
{
//此处代码可以自定义
Delegate.Remove(_OnTemperatureChange, value);
}
}
十三、C# 事件的更多相关文章
- (十三)事件分发器——event()函数,事件过滤
事件分发器——event()函数 事件过滤 事件进入窗口之前被拦截 eventFilter #include "mywidget.h" #include "ui_mywi ...
- 【转载】COM 组件设计与应用(十三)——事件和通知(VC6.0)
原文:http://vckbase.com/index.php/wv/1243.html 一.前言 我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者: 我的 COM 组件 ...
- JavaScript高级程序设计学习笔记第十三章--事件
事件冒泡: IE 的事件流,事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).例如: <!DOCTYPE html> <htm ...
- JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
contextmenu事件 该事件用以表示何时应该显示上下文菜单,以便开发者取消默认的上下文菜单,转而提供自定义的菜单. 因为该事件属于鼠标事件,所以其事件对象中包含与光标位置有关的所有属性.如: & ...
- 《Javascript高级程序设计第3版》精华总结
一.JavaScript简介 1.1 javascript简史 1.2 javascript实现 + javascript是一种专为网页交互而设计的一种脚本语言,javascript由三大部分组成 ...
- js-JavaScript高级程序设计学习笔记9
依然第十三章 事件 1.页面上的所有元素都支持鼠标事件,除了mouseenter和mouseleave,所有鼠标事件都会冒泡. 2.修改键:shift.ctrl.alt.meta.四个属性表示修改键的 ...
- js-JavaScript高级程序设计学习笔记8
第十三章 事件 1.DOM2级事件规定的事件流包括三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段. 2.大部分浏览器都会在捕获阶段出发对象上的事件,结果就是,有两个机会在目标对象上面操作事件. 3 ...
- javascript高级程序设计读书笔记
第2章 在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...
- 《JavaScript高级程序设计》 阅读计划
第一周 第1章 JavaScript简介 1 第2章 在Html中使用JavaScript 1 第3章 基本概念 3 第二周 第4章 变量.作用域和内存 ...
- 使用回调接口实现ActiveX控件和它的容器程序的通讯
本文阅读基础:有一定的C++基础知识(了解继承.回调函数),对MFC的消息机制有一定了解,对COM的基础知识有一定了解,对ActiveX控件有一定了解. 一. 前言 ActiveX控件和它的容器程序如 ...
随机推荐
- xlslib安装, aclocal-1.13: command not found, 安装升级autoconf-2.65.tar.gz, automake-1.13.tar.gz两个文件
问题1: $ make CDPATH="${ZSH_VERSION+.}:" && cd . && aclocal-1.13 -I m4 /bin/ ...
- [LeetCode#252] Meeting Rooms
Problem: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2] ...
- 在C#中使用WIA获取扫描仪数据
WIA(Windows Image Acquire,最新版本2.0)是Windows中一组从设备中捕获图像的标准API集合,它可以从设备(例如扫描仪.数码相机)中获取静态图像,以及管理这些设备.它既是 ...
- Unity3D学习笔记-------小地图制作
制作小地图首先需要两个贴图:第一个贴图是小地图的背景贴图,它应当是从y轴向下俯视截取的贴图:第二个贴图是主角位置贴图,它应当是在背景贴图之上的小型矩形. 1 using UnityEngine; 2 ...
- mac下的改装人生——关于机械键盘
这几天好像弄了很多关于机械键盘的东西,我自己的这块键盘也已经慢慢熟悉了,感觉打字超级爽哈,然后看了很多网上关于机械键盘的帖子,也看了很多教程,在Amazon和Taobao看了很多键盘的价位,前几天还试 ...
- 在Ubuntu中设置中文输入法
在Ubuntu中设置中文输入法 */--> pre { background-color: #2f4f4f;line-height: 1.6; FONT: 10.5pt Consola,&quo ...
- Matlab编程-矩阵函数
(1) are函数 功能:求解Riccati方程的解 Riccati方程的一般形式:A^TX+XA-XBX+C=0 (2)blkdiag函数 函数功能:a=blkdiag(a1,a2,a3,…)表示生 ...
- Pick-up sticks - POJ 2653 (线段相交)
题目大意:有一个木棒,按照顺序摆放,求出去上面没有被别的木棍压着的木棍..... 分析:可以维护一个队列,如果木棍没有被压着就入队列,如果判断被压着,就让那个压着的出队列,最后把这个木棍放进队列, ...
- hdu1195 Open the Lock (DFS)
Problem Description Now an emergent task for you is to open a password lock. The password is consist ...
- 内存数据库MemSQL ——基于内存,MVCC+哈希表、跳表
本周数据库业界探讨最火热的话题就是MemSQL,究竟是不是"旧瓶装新酒"引发了诸多的辩论,同时也引发了究竟是产品技术重要还是DBA重要的疑问.网络中有一些关于MemSQL的介绍,基 ...