学习C#委托与事件

学习参考资料:
  MSDN:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconprovidingeventfunctionality.htm

 CodeProject: http://www.codeproject.com/csharp/events.asp


    几天来参照MSDN上的委托事件的例子,自已写了一个关于委托的事件。例子很简单,但也能说明关于委托与事件是个什么东西吧。

    委托,功能就相当于C/C++中的函数指针。可以用定义的委托来调用所指向的函数。

    先声明一个简单的委托:

学习C#委托与事件 // 声明委托:
学习C#委托与事件
public   delegate   void  DeFunction( int  a, int  b);
学习C#委托与事件
学习C#委托与事件
// 函数声明:
学习C#委托与事件
public   void  Swap( int  a, int  b)
学习C#委托与事件
{
学习C#委托与事件
//学习C#委托与事件.
学习C#委托与事件
}

学习C#委托与事件
学习C#委托与事件
// 建立一个委托引用,以指向相应的函数。
学习C#委托与事件
DeFunction defun;
学习C#委托与事件defun
= new  Defunction(Swap);
学习C#委托与事件
学习C#委托与事件
学习C#委托与事件
// 使用委托来代替函数的调用
学习C#委托与事件
defun( 3 , 4 );  // 实际上是调用的Swap(3,4)


OK,究竟委托在.net中发挥了什么用处?答案是:可以用于事件。

    事件,就是在程序中发生某些情况,需要被相应的函数来处理,比如按纽被按下(Button click)就是一事件,调用到某个函数来处理这个情况。关键的关键是:Button是一个类,它的所有函数都已被封装好,已经不可能再在类中添加相应的函数来处理这个Button被按下究竟该怎么处理。难道像下面这样吗?

学习C#委托与事件 class  Button
学习C#委托与事件
{
学习C#委托与事件   学习C#委托与事件..
学习C#委托与事件   
public Button_Click(object sender,EventArgs e)
学习C#委托与事件   
{
学习C#委托与事件     
//处理Button被按下的代码,需要在这里更改Button被按下的代码
学习C#委托与事件
    }

学习C#委托与事件
学习C#委托与事件   
public click()
学习C#委托与事件  
{
学习C#委托与事件     
//告诉这个Button类什么情况下是被按下的,然后调用Button_Click来处理之
学习C#委托与事件     
//比如,当鼠标在这个Button下按这个按纽时,当Button有交点并按Enter时。都表示鼠标被按  下。
学习C#委托与事件
      Button_Click();
学习C#委托与事件   }

学习C#委托与事件}

这样多不实用,多不现实啊。所以,只能想另外的办法...比如可以让Button_Click变成虚拟函数,然后。添加Button时继承这此Button,然后改写这个函数。但也有一个问题,就是我想让处理按纽被按下时的函数是自定义的,比如MyButton_Click,这样子就没有办法了。

如果用委托来做会是什么样的情况?

首先,要定义一个委托。
   public delegate void MyEventHandle(object sender,EventArgs e);
注意,在事件中用委托一般命名为EventHandle.

然后,在Button类中可以这样表示:

学习C#委托与事件 public   class  Button
学习C#委托与事件
{
学习C#委托与事件    
public MyEventHandle buttonclick; //委托类型
学习C#委托与事件
    
学习C#委托与事件    
public virtual void OnClick(EventArgs e)
学习C#委托与事件    
{
学习C#委托与事件        
if(buttonclick!=null)
学习C#委托与事件             buttonclick(
this,e);  //注意,在定义button类的时候,还不知道这个委托会挂到哪个函数上面去,但是肯定会挂到某个函数上面去。
学习C#委托与事件
     }

学习C#委托与事件
学习C#委托与事件    
public void click()
学习C#委托与事件    
{
学习C#委托与事件       EventArgs e 
= new EventArgs(); //这里是事件参数类型,是一个类,可以派生此类,做个自定义的参数集。
学习C#委托与事件
       OnClick(e);
学习C#委托与事件     }

学习C#委托与事件}

学习C#委托与事件

这样的类定义好了,那么我们用它的时候就简单多了。不需要往里改写任何里面的东西,只要添加我们想要的函数就好了。

在我们的(客户端)上。
1.写Button被按下时处理的函数,函数随便怎么命名都可以。
学习C#委托与事件 public   class  DoButton
学习C#委托与事件
{
学习C#委托与事件    
public void MyButton_Click(object sender,EventArgs e)
学习C#委托与事件    
{
学习C#委托与事件      
//这里写上我们要写的处理内容即可,sender就是Button的对象实体。
学习C#委托与事件      
//学习C#委托与事件.
学习C#委托与事件
    }

学习C#委托与事件}

学习C#委托与事件

2.挂钩,把上面的函数与Button类中的委托挂起来
学习C#委托与事件   Button bt  =   new  Button();
学习C#委托与事件  DoButton dobutton 
=   new  DoButton();
学习C#委托与事件  
学习C#委托与事件  bt.buttonclick 
+=   new  MyEventHandle(dobutton.MyButton_Click);  // 已与Button中的委托挂钩了
学习C#委托与事件  
学习C#委托与事件  
// 下面,如果发生click事件,就可以调用我们写的MyButton_Click函数了。
学习C#委托与事件
  bt.click();  


写的示例代码: http://files.cnblogs.com/shipfi/MyEventSamle.rar 

你可能感兴趣的:(C#)