详解C#事件机制

C#中的委托事件机制是这种语言的一大亮点,以一种更加安全和高效的方式可以实现类似C语言中的函数指针,Qt中的信号槽机制和委托事件机制在实际运用中颇为相似,但是,C#使用上更加方便。下面,我先贴个图来展示一个事件机制的原理:

上述Publisher类的作用就是定义委托、定义事件以及定义触发事件的方法;

Subscriber类的作用注册事件,并且定义具体的事件处理方法。(好像Subscriber类不需要注册事件,注册事件是在运行的模块进行)

这种思想本人以为就是:还没想好怎么做就先搭个框架(写个函数声明),以后那些客户谁想具体怎么做,以后他自己想办法去,我们只把函数签名声明好就够了,免得客户对我们细致的定义不满意。

【上图我感觉解释事件还是有点儿不好理解,我认为理解事件其实就是通过注册事件将事件和事件处理函数联系起来,当事件发生时,我们将我们需要的事件处理函数注册到该事件中,使得我们满意的处理过程发生。】

举个例子(例子是借鉴别人的博文 《C# 事件机制》)

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Delegate_And_Event
{
    public delegate void SalaryComputeEventHander(object sender, MyEventArgs e);
    public class Employee
    {
        public event SalaryComputeEventHander SalaryCompute;
        public virtual void OnSalaryCompute(MyEventArgs e) //触发事件的函数
        {
            if(SalaryCompute != null)
            {
                SalaryCompute(this,e);
            }
        }
    }
    public class MyEventArgs : EventArgs
    {
        public readonly double _salary;
        public MyEventArgs(double salary)
        {
            this._salary = salary;
        }
    }
    public class HumanResource
    {
        //具体的事件处理函数
        public void SalaryHandler(object sender, MyEventArgs e)
        {
            Console.Write("Salary is {0}",e._salary);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Employee ep = new Employee ();
            HumanResource hr = new HumanResource ();
            MyEventArgs e = new MyEventArgs (20000.5);
            ep.SalaryCompute += new SalaryComputeEventHander(hr.SalaryHandler);   //将具 体事件处理函数注册到事件中
            while (true)
            {
                Thread.Sleep(1000);
                ep.OnSalaryCompute(e);                   
            }

        }        
    }
}
时间: 2024-07-30 23:07:49

详解C#事件机制的相关文章

百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:

原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和DOM编程里的事件模型一样,百度地图API也提供了类似的事件机制.本文介绍了事件监听的添加和移除方法,this指针和事件参数的使用以及绑定事件监听函数中涉及的闭包问题,最后分享了一个用来增强地图API事件机制的开源项目. 事件添加和移除 我们最简单的事件开始,下面的代码示例给map对象添加了click事件的监听

详解mysql复制机制--异步复制,半同步复制和并行复制

详解MySQL复制机制--异步复制,半同步复制和并行复制 **# 异步复制 异步复制是MySQL自带的最原始的复制方式,主库和备库成功建立复制关系后,在备库上会有一个IO线程去主库拉取binlog,并将binlogx到本地,就是下图中Relaylog,然后备库会开启另外一个SQL线程取回放Relay log,通过这种方式达到Master-Slave数据同步的目的. 通常情况下,slave是只读的,可以承担一部分读流量,而且可以根据实际需要,添加一个或者多个slave,这样在一定程度上可以缓解主库

Android AIDL使用详解_Android IPC 机制详解

一.概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来生成用于IPC的代码.从某种意义上说AIDL其实是一个模板,因为在使用过程中,实际起作用的并不是AIDL文件,而是据此而生成的一个IInterface的实例代码,AIDL其实是为了避免我们重复编写代码而出现的一个模板 设计AIDL这门语言的目的就是为了实现进程间通信.在Android系统中,每个进程

苹果IOS,与windows Phone7,系统,内存,CPU处理,及后台程序运行,详解微软墓碑机制的系统

关于ios的多任务以及内存管理 看了很多人为自己的可用内存是350mb还是380mb纠结.为了多优化出一点可用内存费脑筋. ios的任务管理和内存管理,跟windows是有很大差别的.很多人习惯于用 windows的思维去看待ios. windows大家都知道,窗口开的越多,系统越慢,为什么呢?因为所有窗口都在运行,cpu占用率高:并且都占内存.可用内存不足还会迫使系统使用硬盘充当虚拟内存,硬盘频繁读写当然会多耗电,并且硬盘速度也比较慢. ios则不同.首先ios的后台任务,除了极少数可以后台运

详解Android广播机制

应用场景(常见的场景1) (1)同一应用具有多个进程的不同组件之间的消息通信 a)不同应用间的组件之间的消息通信 b)与Android系统在特定情况下的通信,如:系统开机,网络变化等 (2)同一应用内同一组件的消息通信:显然扩展变量的作用域.接口回调.Handler-Message等方式都能更简单的实现. (3)同一应用内的不同组件之间的消息通信(单个进程):对于简单的的情况,依靠接口的回调方式就可解决:而较为复杂的情况,更推荐直接使用EventBus等. 实现原理 设计模式与模型:  Andr

javaScirpt事件详解-原生事件基础(一)

# 事件 > JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间,通过监听特定事件的发生,你能响应相关的操作.**图片引用:UI Events** # 事件流 主要是当时的IE团队提出的事件流逝是事件冒泡流,而Netscape提出的是事件捕获流, 可以使用DOM2级定义的*addEventListener()*方法来处理在冒泡或者捕获阶段调用事件处理程序. ## 事件冒泡 即事件开始时由最具体的元素(文档中嵌套最深的节点)接收,然后逐级

详解javascript事件绑定使用方法

由于html是从上至下加载的,通常我们如果在head部分引入javascript文件,那么我们都会在javascript的开头添加window.onload事件,防止在文档问加载完成时进行DOM操作所出现的错误.如果有多个javascript文件,那么极有可能出现多个window.onload事件,但是最后起作用的只有一个,这时候就需要使用事件绑定来解决这个问题了. IE方式attachEvent(事件名称, 函数),绑定事件处理函数detachEvent(事件名称, 函数),解除绑定 DOM方

Android事件详解——拖放事件DragEvent

1.Android拖放框架的作用? 利用Android的拖放框架,可以让用户用拖放手势把一个View中的数据移到当前layout内的另一个View中去. 2.拖放框架的内容? 1)拖放事件类 2)拖放监听器 3)其他辅助的方法和类 3.拖放过程? 拖放过程有四个基本步骤: 1)启动 为了响应用户开始拖动的手势,需要调用View的startDrag方法来通知系统.startDrag方法的参数需要指定所拖动的数据.元数据和绘制拖动阴影的回调方法. 作为响应,系统首先通过回调来获取拖动阴影,然后在设备

Android事件分发详解(四)——事件传递基础示例

MainActivity如下: package com.cn; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; /** * Demo描述: * Andr