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 没有找到数据库驱动An exception occured in driver: could not find driver
如果一直报这个错误, 第一,你本地没有相关的数据库驱动(mysql:-->pdo_myql,postgresql-->pdo_pgsql等); 需要执行 php -m|grep -i pd ...
- Java中的String,StringBuilder,StringBuffer三者的区别(转发:https://www.cnblogs.com/su-feng/p/6659064.html)
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- requests ip代理池单ip和多ip设置方式
reqeusts库,在使用ip代理时,单ip代理和多ip代理的写法不同 (目前测试通过,如有错误,请评论指正) 单ip代理模式 省去headers等 import requests proxy = { ...
- 【Flask】下载多个文件
使用zipfile模块可以将多个文件打包成zip文件进行下载,但是常规的操作方式会在服务器磁盘上生成一个zip文件占用磁盘空间. 后引入BytesIO将文件写入到内存中然后下载: def dl_pla ...
- Docker学习(二)
docker run ubuntu /bin/echo 'Hello world' docker run -t -i ubuntu /bin/bash docker run 命令运行一个容器 -t ...
- 使用POI将doc文件转换为html
需要的jar包有:有一些是依赖包,可以使用maven下载 doc文件转换为html文件 package com.gsww.sxzz.controller.service; import org.apa ...
- Oracle的PL_SQL的异常处理
--什么是异常 --异常是在PL/SQL运行过程中有可能出现的错误. --执行异常的语句 exception when [异常] when --异常输出信息. --Oracle的预定义异常 CASE_ ...
- python3 字符串属性(四)
1. S.partition(sep) -> (head, sep, tail) Search for the separator sep in S, and return the part b ...
- Delphi 实现检测线程类TThread是否结束
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- IDEA 加载Eclipse项目