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

深入理解.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”的提示.
分享到:
评论

相关推荐

    asp.net 事件和委托 简单例子

    总的来说,理解并熟练运用ASP.NET中的事件和委托对于编写高效、响应式的Web应用程序至关重要。通过将事件与委托结合使用,开发者可以创建出能够优雅地处理用户输入和系统状态变化的程序,同时保持代码结构清晰和模块...

    .NET委托与事件用例

    本文将深入探讨.NET委托和事件,以及它们如何在实际应用中发挥作用。 首先,我们需要了解什么是委托。委托在.NET中可以被视为类型安全的函数指针,它允许我们将方法作为参数传递,或者存储方法以便稍后调用。这种...

    .NET委托 .NET委托

    根据提供的信息,我们可以深入探讨.NET委托(Delegate)的相关概念及其在C#中的应用。下面将详细解释委托的基本概念、用途以及如何在实际编程场景中使用它们。 ### 委托的基本概念 在.NET框架中,委托是一种引用...

    asp.net 事件与委托分析

    3. 定义事件处理方法,该方法的签名应与事件处理程序委托匹配。 4. 使用`event`关键字声明事件,它也是委托类型的实例。 5. 使用`+=`操作符将事件处理方法添加到事件,`-=`操作符用于移除。 6. 创建一个受保护的方法...

    .net C# 委托 调用事件

    本教程将深入探讨C#中的委托及其在ASP.NET中的应用,特别是如何利用委托来调用事件。 一、委托的基本概念 1. **定义委托** 委托是类的一种,它定义了一种方法签名,即接受的参数类型和返回类型。你可以通过`...

    形象化理解.net的委托

    委托的起源可以追溯到C++中的函数指针,但.NET委托更进一步,提供了类型安全和内存管理的保障。在.NET框架中,委托类是系统定义的,如`System.Action`和`System.Predicate`等,它们是预定义的多播委托,可以关联多个...

    .net C#中的委托和事件

    .NET Framework中的委托和事件是C#编程中两个关键的概念,它们在实现事件驱动编程和回调机制方面发挥着重要作用。委托可以被理解为一种类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在一个...

    .net之美的委托笔记

    本文将深入探讨.NET中的委托,帮助你理解其原理和应用。 委托在.NET中可以被视为类型安全的函数指针,允许我们传递方法作为参数,或者存储方法以便稍后调用。这种特性使得代码更加灵活,易于维护,并且能够实现诸如...

    C.NET中的委托和事件.pdf

    ### C#.NET中的委托和事件 #### 委托 在C#.NET中,委托是一种引用类型的数据结构,它封装了方法的引用。通过委托,我们可以将方法作为参数进行传递,或者...希望本文能够帮助读者深入理解C#.NET中的委托和事件机制。

    .net 窗口委托传值

    我们可以创建自定义的委托类型,这通常与事件处理或回调机制有关。在我们的例子中,我们将创建一个委托类型来传递数据和执行操作。 ```csharp public delegate void ValueTransferEventHandler(object sender, ...

    .net事件分析范例

    这个范例 ".net事件分析范例" 是专为初学者设计的,旨在深入理解和掌握.NET中的事件处理概念。以下是对该主题的详细说明: 1. **事件的基本概念**: - 事件是对象状态改变的通知,它允许一个对象(发布者)通知...

    C# 委托 和 事件在 .net Framework中的应用

    首先,让我们深入理解委托。 委托在C#中可以被视为一种类型,它封装了对方法的引用。简单来说,委托允许我们将方法作为参数传递给其他方法,这就是所谓的“将方法作为方法的参数”。在上面的例子中,`GreetPeople`...

    vb.net 委托的例子

    在这个例子中,我们将深入理解委托的使用,并通过一个实际的VB.NET代码示例来说明。 首先,我们需要了解委托的基本语法。在VB.NET中,我们可以使用`Delegate`关键字定义一个新的委托类型。这个类型将定义一个方法...

    Accp6.0 深入.NET平台和C#编程 6-10章

    在这个阶段的学习中,学员将深入理解.NET框架的底层机制,掌握C#语言的高级特性和实际应用,以及如何在.NET平台上构建高效、稳定的软件系统。 第六章主要讲解了.NET框架的核心概念。这部分内容包括.NET框架的结构、...

    VS2010轻松学习C#-从零到深入-天轰穿.NET4趣味编程视频教程_第25讲:委托与事件实例浅析

    在本节“VS2010轻松学习C# - 从零到深入 - 天轰穿.NET4趣味编程视频教程_第25讲:委托与事件实例浅析”中,我们将深入探讨C#编程中的两个核心概念:委托(Delegates)和事件(Events)。这两个概念在.NET框架中扮演...

    C#及VB.NET的委托示例

    在.NET框架中,C#和VB.NET提供了强大的事件处理机制,这一机制的核心概念就是“委托”。委托在编程中可以理解为一种类型,它代表了一组方法的集合,这些方法具有相同的返回类型和参数列表。本示例将深入探讨如何在C#...

    深入.NET平台和C#编程第七章

    本章旨在帮助读者深入理解.NET平台的工作原理,提升C#编程技能,从而更好地利用.NET进行软件开发。 首先,.NET平台是微软推出的一个开放且可扩展的开发平台,它包括.NET Framework、.NET Core(现合并为.NET)和...

    S2 深入.NET平台和C#编程

    3. **.NET内存管理与垃圾回收**:深入理解.NET的垃圾回收机制,包括如何分配和释放内存,以及如何避免内存泄漏。此外,还将探讨内存生命周期和对象存活策略。 4. **C#高级特性**:深入探讨C#的特性,如lambda表达式...

    事件与委托机制.docx

    事件和委托机制是.NET框架中的一种重要特性,它允许我们以一种灵活且安全的方式处理对象间的交互和通信。本文将深入探讨这两个概念及其在实际编程中的应用。 首先,让我们了解什么是委托。委托在.NET中是一种引用...

Global site tag (gtag.js) - Google Analytics