十三、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控件和它的容器程序如 ...
随机推荐
- Volley框架支持HTTPS请求。
第一次写帖子,嘿嘿. 最近了解到google2013IO大会出了个网络框架,正好项目也需要用到,就看了下. 最后发现接口都是HTTPS的,但是Volley默认是不支持HTTPS,网上找了好久,都没有对 ...
- BZOJ 1491 [NOI2007]社交网络
1491: [NOI2007]社交网络 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1159 Solved: 660[Submit][Status] ...
- (转载)php获取mysql版本的几种方法小结
(转载)http://www.jb51.net/article/13930.htm 查询当前连接的MYSQL数据库的版本,可以用下面SQL语句来实现 select VERSION(); 当前$res= ...
- (转载)mysql_query( )返回值
(转载)http://hi.baidu.com/tfbzccqceabfhyd/item/bd01db9f8995204af04215e4 调用mysql_query( ),当查询操作是update. ...
- 【转】 log4cpp 的使用
[转自] http://sogo6.iteye.com/blog/1154315 Log4cpp配置文件格式说明 log4cpp有3个主要的组件:categories(类别).append ...
- C# Dictionary的xml序列化
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- 利用Trie树对字符串集合进行排序并计算特征值
该算法用于将一组乱序的字符串反序列化到一个Trie树中,这个过程即可视为对字符串进行了一次排序. 还可以通过调用 GetFeatureString 将该 Trie 树重新序列化. #include & ...
- 趣解curl
Curl是Linux下一个很强大的http命令行工具,其功能十分强大. 1) 二话不说,先从这里开始吧! $ curl http://www.linuxidc.com 回车之后,www.linuxid ...
- in_array严格模式和普通模式的区别
貌似是因为test转整型变0 0和0 匹配能成功 返回真 启用严格模式发现没有这个问题
- html或jsp实现打印三种方法
1.使用window.print()方法 优点:支持多浏览器 缺点:取消打印,隐藏打印不必要的信息后再显示比较麻烦 如下实现,可以打印当前页面 <input name ="Button ...