十三、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控件和它的容器程序如 ...
随机推荐
- C# 客服端上传文件与服务器器端接收 (简单代码)
简单代码: /*服务器端接收写入 可以实现断点续传*/ public string ConnectUpload(string newfilename,string filepath,byte[] fi ...
- ReactiveCocoa Tutorial
ReactiveCocoa Tutorial – The Definitive Introduction: Part 1/2 ReactiveCocoa教程——明确的介绍:第一部分(共两部分) As ...
- Kong for Enterprise | Kong - Open-Source API and Microservice Management Layer
Kong for Enterprise | Kong - Open-Source API and Microservice Management Layer undefined
- 关于日历控件My97DatePicker 在IE6下出现“无法打开站点,已终止操作”
1.My97DatePicker 官方:http://www.my97.net2.在IE6下出现“无法打开站点,已终止操作”的解决办法(转): .这是一个绝对有效的方法,但是会丢失跨越iframe的特 ...
- matches()方法
java.lang包中的String类和java.util.regex包中的Pattern,Matcher类中都有matches()方法,都与正则表达式有关.下面我分别举例:(字符串:"ab ...
- java传递json数据到前台jsp
在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如: JSON字符串: var str1 = '{ &q ...
- 微信公众平台--网页授权获取用户基本信息(snsapi_userinfo方式)
关于snsapi_userinfo网页授权的说明 以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的.但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注, ...
- c#语言基础编程-转义符
C#转义字符: 引言 为了在程序中能够控制字符的输出以及区分开双引号和单引号(双引号和单引号在程序中标示里面的内容为字符串和字符),所以用一种特殊的字符常量:是·以反斜线"\"开头 ...
- Bash简单介绍
Bash不不过一个命令解析程序. 它本身拥有一种程序设计语言,使用这样的语言,能够编写shell脚本来完毕各种各样的工作.而这些工作是使用现成的命令所无法完毕的.Bash脚本能够使用if-then-e ...
- poj 3294 Life Forms(后缀数组)
题意:给你最多100个字符串,求最长的且是一半以上的字符串的公共子串,如果有多个,按字典序输出. 思路:先把各个串拼起来,中间加上一个之前未出现过的字符,然后求后缀.然后根据h数组和sa数组,求出最长 ...