`
ajuanlong
  • 浏览: 104931 次
社区版块
存档分类
最新评论

深入理解.net的事件与委托机制

 
阅读更多
今天是我在公司里没有任务安排的一天(好难得哦),我决定研究系统的研究一下.net中的事件与委托的机制和原理。以前都是大概的默默忽忽的晓得点,不是很全面,今天我打算要全方位的理解原理,废话就到这里下面进入正题.
事件是特殊的委托(这是个人理解)

  首先介绍一个为什么要在事件中引入委托这个概念:
  事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。

在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate英文为“委托、代表”的意思),该类型提供函数指针的功能。

  原理简介:
  在C#中,一个类可以有域(Fields)、属性(Properties)、方法(Methods)、索引(Indexs)、事件(Events),以及委托(delegate)等成员,其中事件(Events)成员就是用来声明一个类事件的。在类中声明一个事件成员一般采用如下的语法形式:
如在某个类中申明一个MyClick事件成员,其语法如下:
  在C#中,增加了一个新的数据类型delegate(代表)来解决事件处理问题。代表数据类型非常类似于C语言中的指针,其与指针不同的是,其是代码是安全的,可管理的。这里是DelegateName可以是系统已经提供的代理EventHandler,也可以是自己预先定义好的委托,委托的定义如下:
  Public delegate [返回值] delegatename(委托的名字)(参数列表……..)
(它可以放在类外面,也可以放到类中,只要能在代码中访问到即可)
这里注意:如果是这个委托为事件而申明的,这里的返回值的类型就只能是void类型的,否则就要出现问题.

  在C#中,通过使用delegate,你可以通过“+=”(加等于)操作符非常容易地为.Net对象中的一个事件添加一个甚至多个响应方法;还可以通过非常简单的“-=”(减等于)操作符取消这些响应方法。如下面为temp按钮添加Click事件的语句:
在上面声明事件的语句中,Eventhandler是一个delegate(代表)类型,其在.Net类库中如下声明的:
这样,所有形如:void 函娄名(object 参数名,EventArgs 参数名); 的函数都可以作为Control类的Click事件响应方法了。如下面所定义的一个事件响应方法:
  由于是通过delegate(代表类型)来处理事件,因此,可能通过累加使一个事件具有多个响应方法;与此同时,还可以使一个方法作为多个事件的响应方法。(注意:在C#语言类中的event成员后面只能出现“+=”与“-=”两个表示添加与取消事件响应函数的操作符。)

  不管是ASP.Net还是一般的Windows Forms 编程,在C#中,基本上我们遇到的事件响应方法都是说明成如下的形式:
(参考其他资料)

  一个事件响应方法的存取权限、返回值类型、参数及类型甚至方法名称等是否都必须固定不变呢?答案是:不是!

  一般情况下,事件的响应方法中都有两个参数,其中一个代表引发事件的对象即sender,由于引发事件的对象不可预知的,因此我们把其声明成为object类型,所有的对象都适用。第二个参数代表引发事件的具体信息,各种类型的事件中可能不同,这要根据类中事件成员的说明决定。

  我们知道,事件是通过delegate(代表) 来处理的。假设将要表示事件的代表说明成如下形式:
则当涉及上面的事件响应函数声明时,就须要声明成如下的形式:
在给对象添加事件响应方法时就可以用如下的代码实现:
  下面是我根据对委托的理解,自己编写的代码,
  注意目的是为了深入理解事件是怎样和委托结合的。我的想法是这样的:既然microsft已经为button按钮写了onclick事件了(不传递任何参数进入事件),我就打算重新添加一个MyClick事件,当 按钮的onclick事件发生的时候,我就重写默认的onclick事件,执行自己添加的MyClick事件,并传递参数进入事件(MyClick)中进行处理。

  首先添加一个自定义的按钮MyButton,它继承于System.Window.Forms.Button类的.代码如下:
  上面的MyEvenArgs类是我自定义的类,它继承与系统提供的System.EvenArgs类注意目的是为了传入参数进入方法。
  到现在为止,我们已经实现了自己的按钮(自定义了事件和委托,并重写了microsft为我们提供的onclick事件,执行我们的OnClick事件)和Onclick事件中需要的传递参数的MyEvenArgs类

  下面就把我们写的MyButton按钮放到页面上(不是拖放到页面上,这是不可能的),我们至少都要在InitializeComponent方法中加载到页面上
  这时回到设计界面提示错误(这是正常的)(没有刷新)。从这里可以看到
这句话就是注册事件,用自定义button中事件执行MyButton_Click函数方法,其实这就是事件处理程序。

  返回到后台代码的如下:

(这里只是简单的提示有用的消息)



  现在代码就结束了,运行程序就弹出“this is a custom button’s click”的提示.
分享到:
评论

相关推荐

    亮剑.NET深入体验与实战精要3

    4.5.3 委托与事件传递 179 4.6 实现个性化窗体界面 181 4.7 无标题窗体拖动的两种方法 183 4.8 让程序只启动一次——单实例运行 184 4.9 实现系统托盘和热键呼出 185 4.10 进程与多线程的区别 190 4.11 创建多线程...

    亮剑.NET深入体验与实战精要2

    4.5.3 委托与事件传递 179 4.6 实现个性化窗体界面 181 4.7 无标题窗体拖动的两种方法 183 4.8 让程序只启动一次——单实例运行 184 4.9 实现系统托盘和热键呼出 185 4.10 进程与多线程的区别 190 4.11 创建多线程...

    asp.net知识库

    利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文...

    .NET之美:.NET关键技术深入分析

    3.4.4.NET框架中的委托与事件 3.5委托进阶 3.5.1 为什么委托定义的返回值通常都为void 3.5.2如何让事件只允许一个客户订阅 3.5.3获得多个返回值与异常处理 3.6订阅者方法超时的处理 3.7委托和方法的异步调用 ...

    ASP.NET4高级程序设计(第4版) 3/3

    2.4.3 事件如何与事件处理程序连接 46 2.5 Web项目 47 2.5.1 基于项目的开发 47 2.5.2 创建Web项目 48 2.5.3 迁移旧版Visual Studio创建的网站 49 2.6 Visual Studio调试 51 2.6.1 单步调试 52 2.6.2 ...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    2.4.3 事件如何与事件处理程序连接 2.5 Web项目 2.5.1 基于项目的开发 2.5.2 创建Web项目 2.5.3 迁移旧版Visual Studio创建的网站 2.6 Visual Studio调试 2.6.1 单步调试 2.6.2 变量监视 2.6.3 ...

    庖丁解牛纵向切入ASP.NET 3.5控件和组件开发技术.pdf

     本书适合从事asp.net技术多年想往深度理解asp.net工作机制的开发人员阅读,对于刚刚入门的初级开发人员,本书的前面几章也介绍了几个入门性的应用例子,本书还可以作为在校学生的就业预备教材。针对读者安装的开发...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    1.3.5 C#和.NET版本 17 1.3.6 CIL和ILDASM 18 1.4 小结 20 第2章 数据类型 21 2.1 基本数值类型 21 2.1.1 整数类型 22 2.1.2 浮点类型 23 2.1.3 decimal类型 23 2.1.4 字面值 24 ...

    C#实训教程

    5 委托与事件 88 5.1 事件的原理 88 5.2 简单的自定义事件 89 5.3 预定义事件处理机制 92 5.4 内容总结 100 5.5 独立实践 100 6 运算符和类型强制转换 101 6.1 运算符 101 6.2 运算符的简化操作 102 6.3 类型的安全...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    《CLR via C#(第3版) 》针对.NET Framework 4.0和多核编程进行了全面更新和修订,是帮助读者深入探索和掌握公共语言运行时、C#和.NET开发的重要参考,同时也是帮助开发人员构建任何一种应用程序(如Microsoft ...

    跨平台移动端开发NativeScript.zip

    为了避免开发者需要对三个支持的平台有深入的理解,该框架包含了一个抽象与原生代码连接的NativeScript模块层(NativeScript Modules Layer,NML), 可以自动将JavaScript调用转化为原生调用。NML包含如下模 块...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    第8章 深入理解类 363 8.1 类析构函数 363 8.1.1 析构函数的概念 363 8.1.2 默认的析构函数 364 8.1.3 析构函数与动态内存分配 366 8.2 实现复制构造函数 369 8.3 在变量之间共享内存 370 8.3.1 定义联合 371...

    Visual C++ 2005入门经典--源代码及课后练习答案

    第8章 深入理解类 369 8.1 类的析构函数 369 8.1.1 析构函数的概念 369 8.1.2 默认的析构函数 370 8.1.3 析构函数与动态内存分配 372 8.2 实现复制构造函数 375 8.3 在变量之间共享内存 377 8.3.1 ...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    第8章 深入理解类 8.1 类的析构函数 8.1.1 析构函数的概念 8.1.2 默认的析构函数 8.1.3 析构函数与动态内存分配 8.2 实现复制构造函数 8.3 在变量之间共享内存 8.3.1 定义联台 8.3.2 匿名联合 8.3.3 类和结构中的...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    第8章 深入理解类 8.1 类的析构函数 8.1.1 析构函数的概念 8.1.2 默认的析构函数 8.1.3 析构函数与动态内存分配 8.2 实现复制构造函数 8.3 在变量之间共享内存 8.3.1 定义联台 8.3.2 匿名联合 8.3.3 类和结构中的...

    Visual C++ 2005入门经典.part07.rar (整理并添加所有书签)

    第8章 深入理解类 8.1 类的析构函数 8.1.1 析构函数的概念 8.1.2 默认的析构函数 8.1.3 析构函数与动态内存分配 8.2 实现复制构造函数 8.3 在变量之间共享内存 8.3.1 定义联台 8.3.2 匿名联合 8.3.3 类和结构中的...

Global site tag (gtag.js) - Google Analytics