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

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

 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. VS打包资源文件,转自推酷,请小星同学查看

    上篇博客把收费系统的总体设计进行了一遍讲解,讲解的同时掺杂了些有关.NET编译机制的总结.程序编写测试完成后接下来我们要做的是打包部署程序,但VS2012让人心痛的是没有了打包工具.不知道出于什么原因 ...

  2. python 调用内部类的两种方法

    class Car:#外部类 class Door:#内部类 def open(self): print('open door') class Wheel: def run(self): print( ...

  3. 使用U盘在X230上安装Mavericks/Win7-黑苹果之路

    新笔记本x230,毫不犹豫继续开始黑苹果之路,这次当然是上最新版本了,谁知道这条道路真是曲折艰难啊,从年前开始,直到前天才算安装成功,还有一堆硬件没驱动上,现记录过程以备以后查看: 1.准备机器.本来 ...

  4. Android开发-API指南-<action>

    <action> 英文原文:http://developer.android.com/guide/topics/manifest/action-element.html 采集(更新)日期: ...

  5. 【翻译习作】 Windows Workflow Foundation程序开发

    近期整理硬盘,把09年的翻译习作<Windows Workflow Foundation程序开发>找出来了.现在又把译文过了一遍,做了些修改,贴出来献丑了.原书是<Programmi ...

  6. Flash图表控件FusionCharts如何自定义图表上的垂直线

    什么是垂直分割线 垂直(或条形图中的水平)分隔线是用来帮助用户分隔数据块的.可以被放置在任何两个数据点,即使是不规则的间隔也可以. <chart caption='Monthly Revenue ...

  7. sendmessage和postmessage的区别

    BOOL   PostMessage(          HWND   hWnd,             //   handle   of   destination   window        ...

  8. IOS9以上如何导入铃声并设置

    1.打开iTunes,点击左侧的“音乐” .2.在右侧的MP3等音乐列表中选中一个要制作铃声的名字 .3.在这个名字上点击鼠标右键选择“显示简介”,在弹出窗口中选择“选项”.4.在选项标签栏中设定开始 ...

  9. MySql 日期函数

    在 MySql 中经常会用到日期,关于常用的日期函数,做了以下的总结: 1 . now() 作用; 获取当前的日期 除此之外,获取当前日期的函数还有: current_timestamp(); cur ...

  10. django apache error.log过大

    利用apache运行django框架,发现apache中error.log增长迅猛,寻找原因不得,于是手动清空... 但是当server遇到问题时,文件过大,导致定位问题十分不便 于是决定探个究竟 首 ...