C#事件触发机制
C#的事件触发机制,类似于c++的回调函数机制
我先简单说一下,委托和事件的实质,后期再重开一篇博文来详细说
委托:指向方法的指针,类似于C的函数指针
事件:是一个可以存放0个或多个方法指针的数据结构 .......... 在一次编译后会为其生成一个类等等的就以后另开博文说了
看看触发机制

方便理解,来个通俗一点的图

事件触发源类
class cclass
{
private char i;
public delegate void ichanged(cclass s);
public event ichanged value_changed;
protected virtual void onvaluechanged(cclass message_str)//在onxxxxxx方法中触发事件
{
ichanged temp_value_changed = Volatile.Read(ref value_changed);//保持线程安全,保留一个备份
if (temp_value_changed != null)
{
temp_value_changed(message_str);
}
}
public char I
{
get
{
return i;
}
set
{
if(value!=i)
{
i=value;
this.onvaluechanged(this);//值修改时调用onxxxxxxx方法
}
}
}
}
在另一个类中为事件注册方法,修改值时触发事件,执行方法
class Program
{
static void Main(string[] args)
{
cclass c = new cclass();
c.value_changed+=c_value_changed;//把方法注册到事件上,
char i = Console.ReadKey().KeyChar;
)//回车退出
{
Console.WriteLine();
c.I = i;//值修改,事件被触发,执行注册到事件上的所有方法
i = Console.ReadKey().KeyChar;
}
}
private static void c_value_changed(cclass s)
{
Console.WriteLine("value is changed>>>>i:"+s.I);
}
}
效果

源码连接:http://pan.baidu.com/s/1i3UXHKp
C#事件触发机制的更多相关文章
- 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”
回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...
- EventEmitter:nodeJs事件触发机制
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列 Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.r ...
- [转载] 理解 epoll 的事件触发机制
原文: http://weibo.com/p/1001603862394207076573?sudaref=weibo.com epoll的I/O事件触发方式有两种模式:ET(Edge Trigger ...
- html元素双击事件触发机制猜想及疑惑
今天有个同事遇到一个奇怪的问题,我照着他的代码做了一些简化写了这个demo <!DOCTYPE html> <html> <head> <style type ...
- WinForm中的事件触发机制学习
在一个Form窗体中拖个按钮,双击后系统自动生成代码: private void button1_Click(object sender, EventArgs e) { } 同时在窗体的Initial ...
- Yii中事件触发机制
控制器初始化中添加事件处理方法,在需要触发的地方直接触发 public function init() { parent::init(); // TODO: Change the autogenera ...
- python 模拟事件触发机制
EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from queue import Queue, Empty from threading impor ...
- 基于raw os 的事件触发系统
Raw os的事件触发系统有以下特点: 1 基于UML的状态机理念设计,实现了有限状态机(fsm)以及层次状态机(HSM). 2 实现了活动对象(ACTIVE OBJECT)的特性,一个活动对象包含了 ...
- JQuery的方便之处——宽高设置、坐标值和滚动条+事件绑定机制
1.元素的宽高 可以通过css来进行设置,例如:$("元素").css({"宽度":"值","高度":"值&q ...
随机推荐
- Symfony 如何使用ckeditor
首先: 1)加载以下两个bundle "egeloen/ckeditor-bundle": "^4.0","helios-ag/fm-elfinder ...
- oracle decode的用法
需求:分别统计emp表中1980,1981,1982,1987年入职的同事的数量. 这里用decode很容易就解决了: select sum(t.num_1980) as "1980&quo ...
- 磁盘分区对齐详解与配置 – Linux篇
在之前一篇<磁盘分区对齐详解与配置 – Windows篇>中,我介绍了磁盘分区对齐的作用和适用于MBR和GPT的两种磁盘类型的配置,以及Windows平台设置磁盘分区对齐的方法. 本文作为 ...
- 关于VMAX中存储资源池(SRP)
Storage Resource Pool中的相关元素 SRP由一个或多个数据池组成,这些数据池包含了预配置的数据(或TDAT)设备,可为创建和呈现给主机与应用程序的精简设备(TDEVS) 提供存储. ...
- UDP标准模型
伪代码 #服务端 #创建UDP服务器 ss = socket() #创建一个服务器套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfrom ...
- Understanding Linux File Permissions
Although there are already a lot of good security features built into Linux-based systems, one very ...
- ios9 3dtouch 博客
http://my.oschina.net/u/2340880/blog/511509#OSC_h3_3
- DIV+CSS专题:第一天 XHTML CSS基础知识
欢迎大家学习<十天学会web标准>,也就是我们常说的DIV+CSS.不过这里的DIV+CSS是一种错误的叫法,建议大家还是称之为web标准. 学习本系列教程需有一定html和css基础 ...
- R语言编程中的常见错误
R语言编程中的常见错误有一些错误是R的初学者和经验丰富的R程序员都可能常犯的.如果程序出错了,请检查以下几方面. 使用了错误的大小写.help().Help()和HELP()是三个不同的函数(只有第 ...
- django使用bootstrap前端框架
一.下载bootstrap相关文件,放在项目目录中.在blog 应用中新建static目录,bootstrap文件放在此目录下. bootstrap下载网址:http://v3.bootcss.com ...