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#事件触发机制的更多相关文章

  1. 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”

    回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...

  2. EventEmitter:nodeJs事件触发机制

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列 Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.r ...

  3. [转载] 理解 epoll 的事件触发机制

    原文: http://weibo.com/p/1001603862394207076573?sudaref=weibo.com epoll的I/O事件触发方式有两种模式:ET(Edge Trigger ...

  4. html元素双击事件触发机制猜想及疑惑

    今天有个同事遇到一个奇怪的问题,我照着他的代码做了一些简化写了这个demo <!DOCTYPE html> <html> <head> <style type ...

  5. WinForm中的事件触发机制学习

    在一个Form窗体中拖个按钮,双击后系统自动生成代码: private void button1_Click(object sender, EventArgs e) { } 同时在窗体的Initial ...

  6. Yii中事件触发机制

    控制器初始化中添加事件处理方法,在需要触发的地方直接触发 public function init() { parent::init(); // TODO: Change the autogenera ...

  7. python 模拟事件触发机制

    EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from queue import Queue, Empty from threading impor ...

  8. 基于raw os 的事件触发系统

    Raw os的事件触发系统有以下特点: 1 基于UML的状态机理念设计,实现了有限状态机(fsm)以及层次状态机(HSM). 2 实现了活动对象(ACTIVE OBJECT)的特性,一个活动对象包含了 ...

  9. JQuery的方便之处——宽高设置、坐标值和滚动条+事件绑定机制

    1.元素的宽高 可以通过css来进行设置,例如:$("元素").css({"宽度":"值","高度":"值&q ...

随机推荐

  1. Unknown Entity namespace alias 'BaseMemberBundle'.

    $em = $this->getDoctrine()->getManager('member');//要记得写上member $repo = $em->getRepository(' ...

  2. python2 生成验证码图片

    使用pillow或者pil库编写 #coding:utf-8 #use pillow or pil try: from PIL import Image, ImageDraw, ImageFont, ...

  3. 数据库基本表创建 完整性约束 foreign Key

    理解以下几张表的内容,根据实际情况设计属性名.数据类型.及各种完整性约束(primary key.foreign key.not null.unique.check),用数据定义语言实现,然后设计实验 ...

  4. Data Structure Array: Maximum circular subarray sum

    http://www.geeksforgeeks.org/maximum-contiguous-circular-sum/ #include <iostream> #include < ...

  5. 51nod 1196

    题目 神犇题解:见题目讨论区曹鹏神犇的讲解. 跪烂..倒地不起.. 对于每一个合法解,我们都可以将其唯一地分解成若干个“链”.所谓链是指由那些小于n/2的字符组成的,并且最后一个字符满足2*i> ...

  6. Add Tags to Neutron Resources

    给一个network加上tag,用来: Ability to map different networks in different OpenStack locations to one logica ...

  7. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  8. java是用utf-16be编码方式编的。中文和英文都是两个字节

  9. 实现两个窗口通信方法-postMessage

    此方案可解决跨域而且跨Iframe,而且http和https之间的交互 首先来看一下基本的语法 otherWindow.postMessage(message, targetOrigin, [tran ...

  10. php断点续传

    http://www.cnblogs.com/xproer/archive/2012/10/26/2741264.html