上文简述了委托,所谓的简述,只是说了一下如何使用委托,既然有了委托的基础,便可以稍微一探事件的机制。

事件,实际上是委托类型,事件处理函数如下:

 public delegate void  MyHander(object sender, MyEventArgs e);//声明一个委托,其中要与事件的签名一致

委托要与将要处理的函数形式一致,所以其有两个参数,一个是消息的发送者sender,即触发事的对象,一个是包含的要处理的数据e。

对与上述代码,其中,MyEventArgs属于定义的一个类,继承于EventArgs,这个类基本包含了GUI所需的一切数据,但是额外的需求,就需要另外定义,例如本文后附带的例子。

事件,

public event MyHander myevent;

定义了一个事件类型的变量,其中MyHander是一个声明好的委托类型。

首先委托与函数关联,然后事件与委托关联,如此,事件便可以调用函数,基本流程如下(实际代码组织时,这几句不会挨着的):

 public delegate void  MyHander(object sender, MyEventArgs e);
MyHander myhander = new MyHander(OutPut);//OutPut是一个执行具体功能的函数,通过此,委托与函数关联
public event MyHander myevent;//定义事件变量
myevent += myhander;//事件与委托关联 //下面触发事件
myevent(this,e);

完整的一个代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace EvenTest2
{
public class MyEventArgs : EventArgs//1.写好自己定义的继承基本的事件参数类 这个要是共有类
{
public string sentence;
}
public delegate void MyHander(object sender, MyEventArgs e);//2、声明一个委托,其中要与事件的签名一致
class A
{
public void OutPut(object sender, MyEventArgs e)//3、设计好实际做事的类
{
Console.WriteLine(e.sentence);
}
public A(B b)//5、(跳一步,这是第五步)根据1步中声明的委托,定义一个委托变量,然后将这个委托变量与OutPut这个干活的绑定一起
{
MyHander myhander = new MyHander(OutPut);
b.myevent += myhander;//6、将B中声明的事件与 上一句中处理好的委托变量绑定,这样,便可以通过myevent调用OutPut了
}
}
class B//4、设计事件的类,也就是设计用来调用委托对象的事件,通过A类的构造函数与其绑定,方可以调用
{
public event MyHander myevent;
public void callevent(MyEventArgs e)
{
if (myevent != null)
{
myevent(this, e);//7、这一句是调用的开端,从此,如链式爆炸一般,一发不可收拾myevent-myhander-OutPut
}
}
}
class Program
{
static void Main(string[] args)
{
MyEventArgs e1 = new MyEventArgs();
e1.sentence = "我也会自定义事件了!!!";
B b = new B();
A a = new A(b);
b.callevent(e1); }
}
}

其实,我觉得这段来自网络自己改的代码存在一点问题,绕了一点。就是 是 event 接收了 delegate类型的参数,而delegate接受了function,实际上,可以直接event 用+= 或者 -=接受function(来自C#本质论中文版第三版398页)。

C#之事件初步的更多相关文章

  1. Dom事件初步了解

    1.事件流 事件流可以分为两种:事件冒泡和事件捕获 1. 事件冒泡就是从目标元素一直冒泡到根元素html(IE和DOM浏览器都有) 2. 事件捕获就是从根元素到目标元素(DOM浏览器支持) 2.事件处 ...

  2. C#基础——事件初步

    事件是C#语言的重要成员之一,初学者往往不能很好的去理解和运用事件,特别是自定义事件.在这里将以较简单的方式呈现事件最基本的用法. 1.事件的定义 给事件下定义是一个较困难的事,因为它体现的是对象与对 ...

  3. Vue directive 回调运用

    Vue的官方自定义directive,基本调用简洁如下: Vue.directive('my-directive', { bind: function () {},// 指令与被绑定元素第一次绑定时触 ...

  4. JNI详解---从不懂到理解

    转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...

  5. Release编译模式下,事件是否会引起内存泄漏问题初步研究

    题记:不常发生的事件内存泄漏现象 想必有些朋友也常常使用事件,但是很少解除事件挂钩,程序也没有听说过内存泄漏之类的问题.幸运的是,在某些情况下,的确不会出问题,很多年前做的项目就跑得好好的,包括我也是 ...

  6. 初步揭秘node.js中的事件

    当你学习node.js的时候,Events是一个非常重要的需要理解的事情.非常多的Node对象触发事件,你能在文档API中找到很多例子.但是关于如何写自己的事件和监听,你可能还不太清楚.如果你不了解, ...

  7. C#学习之初步理解委托、事件、匿名方法和Lambda

    最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对 ...

  8. Cocos2dx 3.1.1 学习笔记整理(4):事件监听与Action的初步使用

    项目忙,趁着刚才有点空,看了下触摸事件在新版本中怎么实现,遇到问题都是去:cocos2d-x-3.1.1\tests\cpp-tests\Classes下面找的,里面都是一些小例子. 首先新的CCNo ...

  9. 初步理解JS的事件机制

    一.事件流(捕获,冒泡)   事件流:指从页面中接收事件的顺序,有冒泡流和捕获流. 当页面中发生某种事件(比如鼠标点击,鼠标滑过等)时,毫无疑问子元素和父元素都会接收到该事件,可具体顺序是怎样的呢?冒 ...

随机推荐

  1. NSArray、NSMutableArray基本用法

    NSArray.NSMutableArray基本用法 一.基本操作 初始化方法:1.init返回一个空数组 2.initWithArray从已有数组初始化 3.initWithContentsOfFi ...

  2. 软件测试—— junit 单元测试

    Tasks: Install Junit(4.12), Hamcrest(1.3) with Eclipse Install Eclemma with Eclipse Write a java pro ...

  3. Jsp:useBean标签的使用

    1.<jsp:useBean id="为Bean起的别名(随意起)" class="Bean的目录,从包名开始写" scope="page | ...

  4. LA3211 飞机调度 Now or later-二分法&TwoSet

    https://vjudge.net/problem/UVALive-3211 As you must have experienced, instead of landing immediately ...

  5. ASP.NET MVC4 学习系统一(项目模板)

    项目模板 1.空模板      空模板用于创建ASP.NETMVC 4网站的架构,包含基本的文件夹结构,以及需要引用的asp.netmvc程序集,也包含可能要使用的javaScript 库.模板同样包 ...

  6. cacti快速安装

    一.cacti概述 1. cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用户. ...

  7. AX 的 NumberSequences

    EG: 在库存模块新加一个numberSequences. 1. 新加一个EDT\ SML_Test1; 2. 在库存模块的 class\NumberSeqReference_Inventory\Lo ...

  8. Landsat8免费下载地址

    一.国外 Landsat8提供免费下载,在USGS上有两个网站,下面介绍的这个网站操作比较方便.这里大赞美国的USGS和NASA机构,不但提供免费下载的数据,而且下载网站制作和维护的非常便捷.废话少说 ...

  9. 会"说话"的勒索病毒Cerber

    最近有个案子与勒索病毒有关,证物是个台式机,运行Windows 7 64bit操作系统,委托方是某高科技公司,希望能调查出事发的关键时间点.感染来源及途径.恶意程序文件名等相关信息. 在对证物计算机进 ...

  10. Unieap3.5-JS常用方法

    引用js文件 获得当前主体 getDimensionId(); 当前单位类型(网点,分部,总部) getUnitType(); 数据库日期 newOracleDate(); unieap.byId(& ...