`
maxwellens
  • 浏览: 13180 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

C#事件机制及响应方法

    博客分类:
  • .Net
阅读更多
C#语言自C/C++演变而来。它是现代、简单、完全面向对象和类型安全的。C#语言是微软公司针对.Net平台才推出来的一门新语言,作为.Net平台的第一语言,它几乎集中了所有关于软件开发和软件工程研究的最新成果。面向对象、类型安全、组件技术、自动内存管理、跨平台异常处理、版本控制、代码安全管理…… 在.NET应用程序开发中,不管是WEB Forms(ASP.NET)还是Windows Forms,都涉及到大量对象的事件响应及处理,比如客户在线提交一份订单、或是在Windows窗口上移动鼠标等都将有事件发生。那么在C#中,是怎样声明事件并为事件添加响应方法的呢?下面的文章对此为大家作了详细的讲述。 原理简介 ;在C#中,一个类可以有域(Fields)、属性(Properties)、方法(Methods)、索引(Indexs)、事件(Events)等成员,其中事件(Events)成员就是用来声明一个类事件的。在类中声明一个事件成员一般采用如下的语法形式:public event 代表名 事件名。

1.委派的实现过程。
首先来看一下委派,委派其实就是方法的传递,并不定义方法的实现。事件其实就是标准化了的委派,为了事件处理过程特制的、稍微专业化一点的组播委派(多点委派)。下面举一个例子,我觉得把委派的例子和事件的例子比较,会比较容易理解。
using System; 
  
class Class1 
{ 
       delegate int MathOp(int i1,int i2); 
       static void Main(string[] args) 
       { 
               MathOp op1=new MathOp(Add); 
               MathOp op2=new MathOp(Multiply); 
               Console.WriteLine(op1(100,200)); 
               Console.WriteLine(op2(100,200)); 
               Console.ReadLine(); 
       } 
       public static int Add(int i1,int i2) 
       { 
               return i1+i2; 
       } 
       public static int Multiply(int i1,int i2) 
       { 
              return i1*i2; 
       } 
} 
 
首先代码定义了一个委托MathOp,其签名匹配与两个函数Add()和Multiply()的签名(也就是其带的参数类型数量相同):
delegate int MathOp(int i1,int i2);
Main()中代码首先使用新的委托类型声明一个变量,并且初始化委托变量.注意,声明时的参数只要使用委托传递的函数的函数名,而不加括号:
MathOp op1=new MathOp(Add);
(或为MathOp op1=new MathOp(Multiply);)
委托传递的函数的函数体:
public static int Add(int i1,int i2) 
{ 
       return i1+i2; 
} 
public static int Multiply(int i1,int i2) 
{ 
      return i1*i2; 
} 
然后把委托变量看作是一个函数名,将参数传递给函数。 Console.WriteLine(op1(100,200));
Console.WriteLine(op2(100,200));
 
 
2.事件的实现过程
using System; 
  
class Class1 
{ 
       static void Main(string[] args) 
       { 
               Student s1=new Student(); 
               Student s2=new Student(); 
               s1.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK); 
               s2.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK); 
               s1.Register(); 
               s2.Register(); 
               Console.ReadLine(); 
       } 
       static void Student_RegisterOK() 
       { 
              Console.WriteLine("Hello"); 
       } 
} 
  
class Student 
{ 
       public delegate void DelegateRegisterOkEvent(); 
       public event DelegateRegisterOkEvent RegisterOK; 
       public string Name; 
       public void Register() 
       { 
              Console.WriteLine("Register Method"); 
              RegisterOK(); 
       } 
} 
在Student类中,先声明了委托DelegateRegisterOkEvent(),然后使用event和要使用的委托类型(前面定义的DelegateRegisterOkEvent委托类型)声明事件RegisterOK(可以看作是委托的一个实例。):
public delegate void DelegateRegisterOkEvent(); 
public event DelegateRegisterOkEvent RegisterOK; 
然后在Main()函数中,实例化Student类,然后s1.RegisterOK事件委托给了Student_RegisterOK 方法。通过“+=”(加等于)操作符非常容易地为.Net对象中的一个事件添加一个甚至多个响应方法;还可以通过非常简单的“-=”(减等于)操作符取消这些响应方法。
然后,当调用s1.Register()时,事件s1.RegisterOK发生。

using System;

class Class1

{
       static void Main(string[] args)
       {
               Student s1=new Student();
               Student s2=new Student();
               s1.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK);
               s2.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK);
               s1.Register();
               s2.Register();
               Console.ReadLine();
       }

       static void Student_RegisterOK()
       {
              Console.WriteLine("Hello");
       }
}

class Student

{
       public delegate void DelegateRegisterOkEvent();
       public event DelegateRegisterOkEvent RegisterOK;
       public string Name;

       public void Register()

       {
              Console.WriteLine("Register Method");
              RegisterOK();
       }
}

  在Student类中,先声明了委托DelegateRegisterOkEvent(),然后使用event和要使用的委托类型(前面定义的DelegateRegisterOkEvent委托类型)声明事件RegisterOK(可以看作是委托的一个实例。):

public delegate void DelegateRegisterOkEvent();

public event DelegateRegisterOkEvent RegisterOK;

  然后在Main()函数中,实例化Student类,然后s1.RegisterOK事件委托给了Student_RegisterOK 方法。通过“+=”(加等于)操作符非常容易地为.Net对象中的一个事件添加一个甚至多个响应方法;还可以通过非常简单的“-=”(减等于)操作符取消这些响应方法。

  然后,当调用s1.Register()时,事件s1.RegisterOK发生。


3.C#中预定义事件处理方式
    学习事件,我觉得最不好理解的就是C#中预定义了事件,使我才开始学习事件时一头雾水。在查了些资料后,终于弄明白了一些,如下:
EventArgs是包含事件数据的类的基类,用于传递事件的细节。
EventHandler是一个委托声明如下(其在.Net类库中如下声明的)
public delegate void EventHandler( object sender , EventArgs e ) 所以,所有形如: 
void 函娄名(object 参数名,EventArgs 参数名);
的函数都可以作为Control类的Click事件响应方法了。如下面所定义的一个事件响应方法:
private void button1_Click(object sender, System.EventArgs e)
参数object sender表示引发事件的对象,(其实这里传递的是对象的引用,如果是button1的click事件则sender就是button1)System.EventArgs e 代表事件的相应信息,如鼠标的x,y值等。
下面我们研究一下Button类看看其中的事件声明,以Click事件为例。
public event EventHandler Click;
这里定义了一个EventHandler类型的事件Click
private void button1_Click(object sender, System.EventArgs e)
{
   ...
}
这是我们和button1_click事件所对应的方法。注意方法的参数符合委托中的签名(既参数列表)。那我们怎么把这个方法和事件联系起来呢,请看下面的代码。
this.button1.Click += new System.EventHandler(this.button1_Click); (其实button1.Click 为System.EventHandler委派的实例事件。与委派中委派实例委托给某一方法非常相似)
把this.button1_Click方法绑定到this.button1.Click事件。
 
 
4.事件的参数的使用。
using System; 
  
class Class1 
{ 
       static void Main() 
       { 
               Student s1=new Student(); 
               s1.Name ="Student1"; 
               Student s2=new Student(); 
               s2.Name ="Student2"; 
              s1.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK); 
               s2.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK); 
  
               //当Register方法一执行,触发RegisterOK事件 
               //RegisterOK事件一触发,然后执行Student_RegisterOK方法 
               s1.Register();   
              s2.Register(); 
              Console.ReadLine(); 
       } 
       static void Student_RegisterOK(RegisterOkArgs e) 
       { 
              Console.WriteLine(e.EventInfo); 
       } 
} 
  
class Student 
{ 
       public delegate void DelegateRegisterOkEvent(RegisterOkArgs e); 
       public event DelegateRegisterOkEvent RegisterOK; 
       public string Name; 
       public void Register() 
       { 
              Console.WriteLine("Register Method"); 
              RegisterOK(new RegisterOkArgs("Student Name: "+Name)); 
       } 
} 
class RegisterOkArgs:EventArgs 
{ 
       public string EventInfo; 
       public RegisterOkArgs(string eventInfo):base() 
       { 
              this.EventInfo =eventInfo; 
       } 
}



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/vsweaver/archive/2006/08/01/1007145.aspx
分享到:
评论

相关推荐

    C#事件及响应方法详解

    在C#编程中,事件和响应...总之,C#中的事件和响应方法是通过委托实现的,提供了一种安全、类型化的机制,使得对象之间能够以声明的方式进行通信。理解和熟练使用事件和响应方法是编写高效、健壮的C#应用程序的关键。

    C#消息循环与响应机制

    ### C#消息循环与响应机制 #### 概述 在探讨C#消息循环与响应机制之前,我们首先简要回顾一下MFC(Microsoft Foundation Classes)中的消息处理方式。MFC框架下,每个窗口都有一个消息循环,这个循环不断检查是否...

    C#事件实例,C#事件实例,C#事件实例

    在C#中,事件是委托类型的实例,它保护了事件源(引发事件的对象)和事件处理程序(响应事件的代码)之间的耦合。 二、事件的特点 1. 安全性:事件提供了一种安全的方式来传递信息,防止不相关的代码直接调用事件...

    c# 委托、事件详解及事件处理机制

    总结一下,委托和事件在C#中提供了强大的功能,它们允许编写更灵活、响应式的代码,特别是在处理用户交互、多线程和异步操作时。理解并熟练运用这两个概念,对于开发高效、健壮的C#应用程序至关重要。通过阅读提供的...

    C# Message (消息机制)

    C# 中的消息机制是通过对消息的封装来实现的,其中消息被封装成了事件。 一、消息概述 消息是通知和命令,在 .NET 框架类库中的 System.Windows.Forms 命名空间中,微软采用面对对象的方式重新定义了 Message。新...

    C# 检测USB设备插拔及响应各个事件

    在C#编程中,检测USB设备的插拔和响应相关事件是通过Windows API以及.NET Framework提供的类库来实现的。本文将深入探讨如何利用C#实现实时监测USB设备的插入和移除,并处理相关事件。 首先,我们需要了解Windows...

    C#消息处理机制

    在C#编程语言中,消息处理机制是一种核心的特性,它涉及到用户界面(UI)的交互和事件驱动编程。理解这一机制对于开发高效、响应性强的应用程序至关重要。本文将深入探讨C#的消息处理机制,包括事件、委托、事件处理...

    C#处理事件的过程

    这些方法会在各自的上下文中执行,通常用于执行响应事件的操作。 6. **取消订阅事件**: 当不再需要接收事件通知时,可以取消订阅事件: ```csharp myInstance.MyEvent -= OnMyEvent; ``` 取消订阅非常重要,...

    C#+响应键盘事件

    在C#编程中,响应键盘事件是常见的交互方式,它允许程序根据用户的键盘输入执行相应的操作。例如,当用户按下空格键时,程序可以弹出一个用户界面,提供更丰富的交互体验。以下是对这个主题的详细解释: 一、基础...

    C#委托机制测试

    在事件模型中,事件发布者(通常是类的实例)触发事件,而事件订阅者(通常是类的消费者)通过事件处理程序响应事件。事件的声明通常包含两个部分:一个私有的委托实例变量和一个公开的添加/删除访问器,如: ```...

    C#消息机制

    C#消息机制 C#中的消息机制是基于.NET Framework的,通过封装消息机制来实现与MFC程序的消息映射机制相似的功能。下面是对C#消息机制的详细解释: 一、消息概述 在C#中,消息是整个应用程序的工作引擎,它是通知...

    一些C#线程、事件及委托实例

    在C#编程中,线程、事件和委托是三个核心概念,它们对于构建高效、响应式的应用程序至关重要。这里,我们将深入探讨这些主题,并通过实例来帮助初学者理解它们的原理。 1. **线程** - **定义**:线程是程序执行的...

    C#的核心问题-WIN10系统无法响应触摸屏的按下和弹起事件怎么办.rar

    在C#编程环境中,开发WIN10系统的应用程序时,可能会遇到触摸屏的按下和弹起事件无法正常响应的问题。这通常是由系统配置、驱动不兼容或应用程序代码处理不当导致的。针对这一问题,我们可以从以下几个方面来寻找...

    C#事件Demo

    事件发布者是触发事件的对象,而事件订阅者则是响应事件的对象。在C#中,事件通常通过委托类型来定义,这是一种引用类型,可以存储指向多个方法的引用。 例如,在我们的欢迎界面窗口中,可能有一个按钮控件,当用户...

    自己编写C#事件步骤

    预定义的事件处理机制提供了一种标准的方式来响应控件或其他对象的事件。自定义事件允许开发者扩展这种机制,根据项目需求创建定制的事件通知。通过理解并熟练运用这些概念,你可以构建更灵活、可扩展的C#应用程序。

    C# 事件的实例

    在C#编程中,事件(Event)是一种特殊的委托类型,用于在对象之间实现松耦合的通信机制。这种机制使得一个对象(发布者)能够通知其他对象(订阅者)其状态的变化,而无需直接了解订阅者的具体实现。在这个实例中,...

    C#监控键盘事件

    在回调函数中,我们可以分析键盘消息,然后触发自定义的C#事件,使得其他部分的代码能够响应这些键盘事件。 7. **安全与兼容性问题**: 如描述中提到的,全局键盘监控可能会与杀毒软件冲突,因为这类软件通常也会...

    关于C#事件处理机制的案例分析.pdf

    3. **事件处理**:事件处理方法通常具有与委托匹配的签名,它定义了如何响应事件。这些方法可以是类的成员,也可以是静态方法。 4. **匿名方法和Lambda表达式**:在C#3.0及更高版本中,可以通过匿名方法或Lambda...

    关于C#事件处理机制的案例分析.docx

    而订阅者是响应事件的对象,它注册事件并提供事件处理方法。发布者和订阅者之间通过委托进行通信,但订阅者不能直接调用发布者的事件,而是等待发布者在适当的时机触发事件。这样保证了对象间的解耦,提高了代码的可...

    C# 类间通信实例(事件机制)

    事件由事件源(通常是引发事件的对象)触发,并通过事件处理程序(订阅事件的对象)进行响应。 事件委托是事件的基础,它是事件处理程序的类型引用。在C#中,通常使用`EventHandler<TEventArgs>`委托,其中`...

Global site tag (gtag.js) - Google Analytics