`
liuwentao
  • 浏览: 77960 次
  • 来自: 江西
社区版块
存档分类
最新评论

.Net 机制下委托(一) 事件委托(转载)

    博客分类:
  • C#
阅读更多
.Net 机制下委托(一) 事件委托
oldjacky原创 2005-6-4
一、 认识委托
    一个简单的例子:
 
    张三看到餐桌上有一个桔子,由于自己怕动(主要是出于自己要玩游戏,走不开),立刻就对着他妈妈喊:“我要吃桔子,妈妈帮我拿过来。”,接着,他妈妈听到乖儿子要吃桔子,就立刻送去给儿子了。
    从某种意义上来说,把儿子发出消息要桔子的动作妈妈送桔子给儿子的动作相关联的过程就称为委托,也就是说儿子发出消息要桔子这个事件委派妈妈根据他的消息内容去完成他想要做的事。
 
二、 理解.net机制下的委托概念
    
    关于委托的声明:
   
    delegate 返回类型 方法声明( 参数1,参数2,参数3… );
    
    例如:
delegate void ButtonTextChangeEvent( object sender, EventArgs e );
 
    注意:声明一个ButtonTextChangeEvent,就是创建了一个“委托类”,在编译期间,就会产生个委托类在代码区,因而它可以在类里面声明,也可以跟类在同一域(即命名空间中定义),享受与类同等待遇,那么在这个类里面会有一个最关键的函数就是
 
    virtual 返回类型 方法声明(参数1,参数2,参数3…);

图示:
 

    那么这个Ivoke虚函数是用做干什么的呢?它主要是用来调用某个绑定了的函数,说白了,delegate充其量就是一个中间件(相当于我们所见的媒婆)
 
namespace ConsoleApplicationTest
{
//声明一个委托(如果您学过C++那么它很像C++里面的typedef.)
    public delegate int FunPtr();
    
public class A
    
{
        
//定义一个委托类型的变量(类型:引用)
        public FunPtr ptr; 
}

public class Controller
{
    
public void AdelegateTest()
    
{
         A a 
= new A();
         a.Ptr 
= new FunPtr(Fun); //对a实例中的ptr进行委托绑定
    }

    
public int Fun(){}
}

}


    声明的委托它是类类型(请记住),定义一个委托类型的变量,主要是为了指向某个静态函数的首地址或是实例的中某个函数首地址。,
    委托是面向对象的、类型安全的和保险的,它是对对象的引用以及对该对象内一个或多个方法的引用组成(即多路广播),那么何为多路广播呢?多路广播就是它可以把委托叠加到一起,形成一个委托链表的形式,进行依次调用。
 
    形式:对象.委托变量 += new 委托类( 委托类中invoke的函数声明形式的函数式 )
    举例:button. ptr 
+= new FunPtr (Fun);
 
    关键是“ += ” 形成了一个委托链 ,也可以把它理解成是向委托数据表中添加函数地址,调用时按委托数据表中的顺序依次转至函数式地址进行执行(顺序:先进先出),当然您也可以用“ -= ”来对委托数据表中的函数地址进行移除操作。
 
    **.委托在 .net下面,虽然类似于C++下面的函数指针,但它比C++更安全,更有效,更容易使用。

三、事件委托
    好,现在我们对委托有一定的了解了,现在开始事件委托的历程。
    简单的说,事件委托就是在对象内进行事件声明,而在该对象之外用事件处理函数与对象声明的事件进行绑定,然后,该对象事件的引发,继而执行相应的事件处理函数的一个过程,例如:Button的OnClick事件。
    好,既然说到Button的事件,那我们就一起来模仿一个Button类及Button值改变后引发事件并执行自定义的ButtonTextChangeEvent事件处理函数的过程,从而以事件数据得到该Button赋值过多少次。
我们先来看看这个过程是如何传递的:
 
传递过程:
     Button –
> 赋值 –> 引发ButtonTextChangeEvent –> 调用相应的处理程序
 
    好,现在这流程已经有了,那么,我们一步步来做:
 
namespace ConsoleApplicationTest
{
  
public class Button
  
{
      
private string _Text;
      
public string Text
      
{
          
get return _Text; }
          
set { _Text = value; }
      }

  }

}
   
     到目前为止,一个基本的Button类设计完成(这个就不解释了,谁都知道是啥意思。),它已经具有了赋值的功能,接下来,我们来看第三步,既然要引发事件,那么我们必须得有事件的声明,让事件处理委派于外部处理函数(事件绑定),当对Button.Text赋值时进行引发事件.

namespace ConsoleApplicationTest
{
    
public delegate void ButtonTextChangeEventHander( object sender , System.EventArgs e ); //事件委托的声明。
    public class Button
    
{
        
public event ButtonTextChangeEventHander TxtChange; //定义一个事件委托的引用,以备外部进行事件的绑定.
 
        
private string _Text;
        
public string Text
        
{
            
get return _Text; }
            
set { _Text = value; }
        }

    }

}

 
    好,现在事件的声明与Button的事件的引用也定义了,为了达到Button.Text赋值时引发事件,进行那么现在就到需要在set{…}里面进行事件调用的代码编写:
namespace ConsoleApplicationTest
{
    
public delegate void ButtonTextChangeEventHander ( object sender , System.EventArgs e ); //事件委托的声明。
 
    
public class Button
    
{
        
public event ButtonTextChangeEventHander TxtChange; //定义一个事件委托的引用,以备外部进行事件的绑定.
        private string _Text;
        
public string Text
        
{
            
get return _Text; }
            
set
            

                _Text 
= value; 
 
                System.EventArgs e 
= new EventArgs(); //这里是事件的基类实例.
                 
                ChangeTxt(e); 
//调用事件处理函数.
            }

        }

        
private void ChangeTxt(System.EventArgs e)
        
{
            
if( TxtChange != null )
                TxtChange(
this,e);//真正调用外部指派的处理函数.
        }

    }

}

到此为止,可能有人会问,为什么要这样定义:
 
delegate ButtonTextChangeEventHander ( object sender , System.EventArgs e )
 
如果不用,那不也一样可以吗?
原因也很简单,为了符合.net framework CLS的约定,所有的事件都得遵守 M S 的规定,要不然,嘿嘿,你就麻烦了,事件得不到统一的、规范的处理,所以既然用了MS.Net就遵守她的标准吧,当然在上面的那段程序中不用这样麻烦的定义也是可行的。
 
例如:    delegate ButtonTextChangeEventHander (); 或者
          
delegate ButtonTextChangeEventHander ( int changeCount ); //加上事件数据
 
     ButtonTextChangeEventHander( object sender , System.EventArgs e );//它应该是你经常看到的吧,这种形式就是MS的一种规定,事件处理函数的一种规定,如果您喜欢,可以再加上N个参数在里面也是可以的,比如:异步回调,但这样做唯的一缺点就是不能与MS的事件相统一符合CLS的规定。
 
    Sender :引发事件的对象 ; e:事件所带的数据
 
需要指出的是:

            if( TxtChange != null )
                TxtChange(
this,e);

    如果不加 if( TxtChange != null ) 如果TxtChange并没有绑定事件处理函数,那么它将会发“未将对象引用到实例”的Exception。
 
到目前为止,一个无事件数据的Button设计成型了,那么,现在我们得加上一些绑定代码,进行事件的绑定,得让Button执行赋值时,调用相应的处理函数。
 
using System;
using System.Threading;

namespace ConsoleApplicationTest 

    
public delegate void ButtonTextChangeEventHander( object sender , System.EventArgs e ); //事件委托的声明。
    
    
public class Button 
    

        
public event ButtonTextChangeEventHander TxtChange; //定义一个事件委托的引用,以备外部进行事件的绑定. 
        private string _Text; 
        
public string Text 
        

            
get return _Text; } 
            
set 
<img id="Codehighlighter1_425_541_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codeh
分享到:
评论

相关推荐

    .NET委托 .NET委托

    在.NET框架中,委托是一种引用类型的数据类型,用于封装方法的引用。它类似于其他语言中的函数指针,但提供了类型安全性和更多的功能。委托可以被实例化,并且可以在运行时调用所封装的方法。这种机制使得委托成为...

    .NET委托与事件用例

    总之,委托和事件是.NET框架的关键特性,它们提供了方法间通信和事件通知的机制。理解并熟练运用这两种工具,开发者能够构建出更加灵活、高效和易于维护的应用程序。通过掌握委托和事件的用法,程序员可以更好地利用...

    vb.net 最简单的理解委托

    VB.NET中的委托是实现事件处理、回调函数和异步编程的关键概念。让我们通过这个“vb.net 最简单的理解委托”的主题,深入探讨委托的原理、用法以及如何在实际编程中应用。 首先,我们需要了解什么是委托。委托是一...

    C#.Net事件与委托

    在.NET框架中,事件和委托是两种至关重要的概念,它们为对象间的通信提供了一种安全、灵活的方式。本文将深入探讨C#中的事件和委托,以及它们如何在实际编程中应用。 首先,让我们来理解什么是委托。在C#中,委托是...

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

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

    .net C# 委托 调用事件

    事件的订阅者通过实现与事件委托匹配的方法来响应事件。例如: ```csharp void Page_Load(object sender, EventArgs e) { // 订阅事件 this.MyEvent += new MyEventHandler(HandleMyEvent); } void ...

    .Net中的委托以及事件处理

    有许多人问的,.Net中的委托以及事件处理。我拿简单的例子说明一下,是现实中的例子: 比如说一个公司(场景),你是老板,手下有两个员工,小张和小王。 你命令小王,如果小张玩游戏,则小王扣去小张500元钱。 这...

    vb.net多线程委托托管实例.rar Thread委托托管实例

    本重新为vb.net多线程委托托管实例源码,主要有以下功能模块: 1.Thread多线程技术功能模块, 2.3个实例窗体如何进行委托托管及参数传输功能模块 3.告诉你如何屏蔽错误及不屏蔽错误,如何跨窗口运行。程序以最...

    .net 事件与委托

    在.net框架中,事件是将事件发送者(触发事件的对象)与事件接受者(处理事件的方法)相关联的一种代理类,即事件机制是通过代理类来实现的。当一个事件被触发时,由该事件的代理来通知(调用)处理该事件的相应方法

    .net C#中的委托和事件

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

    C#.NET委托和事件电子书

    C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,电子书 C#,.NET,委托,事件,...

    .net 窗口委托传值

    在.NET框架中,委托是一种类型安全的函数指针,它允许我们传递方法作为参数或存储在变量中。在本文中,我们将深入探讨如何在窗体(Form)之间使用委托进行值传递,特别是在C#和.NET环境中。这个话题是基于一个实际的...

    .net委托与事件代码

    .net委托与事件设计模式我作为初学者理解了很久,借鉴了别人的成果自己写了一个易懂的代码,希望对初学者有用。

    .Net C#委托 delegate

    .NET中的C#委托(Delegate)是面向对象编程中一种强大的特性,它允许我们将方法作为参数进行传递,从而实现回调机制和事件处理。在C#中,委托类是系统内置的,它代表了一种方法签名,使得我们可以引用符合该签名的...

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

    总结起来,委托和事件在.NET Framework中提供了方法间的通信机制,使代码更具灵活性和可扩展性。委托允许我们将方法作为参数传递,从而实现函数式编程的概念,而事件则为实现观察者模式提供了一种安全、有效的方式。...

    vb.net 委托的例子

    总结来说,VB.NET中的委托提供了方法作为参数传递的能力,这使得我们可以灵活地设计事件驱动和回调机制。这个例子展示了如何定义委托,如何在类中使用委托定义事件,以及如何订阅和处理这些事件。掌握委托的使用对于...

    VB.net 事物委托,多控件使用同一事件源码实例

    本实例将深入探讨如何使用VB.NET的事件委托来实现这一目标,特别是在Windows Forms应用中。首先,理解事件和委托是关键。 事件是类(控件)中定义的一种特殊类型的方法,它在特定条件满足时被触发。委托则是类型...

    C#及VB.NET的委托示例

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

Global site tag (gtag.js) - Google Analytics