博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#委托与事件

Posted on 2009-03-21 16:56  Aimee  阅读(187)  评论(0)    收藏  举报
C#委托与事件
- 实现步骤
有以下几步: 1. 申明委托, 2.定义呼叫者和调用的函数, 3.定义被呼叫者和具体实现的函数(被调用的函数)

1.申明委托 ,在包里或者类里,
public
  public delegate void PlayGame(Object sender, EventArgs e);

2.定义呼叫者(类LetsGame)和调用委托的函数,在呼叫者里要有委托的实例(呼叫者扔出一个委托,被呼叫者给这个委托赋值)

class LetsGame{
    public event PlayGame theGame;
    public void startPlay(EventArgs e){
        if(theGame != null){
        theGame(this,e);
    }

3. 定义被呼叫者(类MS)和具体实现的函数(被调用的函数),也就是concrete class的实现或者叫函数指针实例。打个比方,在一个叫MS的类中实现.MS中对呼叫者中委托的实例进行赋值.

class MS {
    public MS(LetsGame lg) {
        lg.theGame += new PlayGame(MSPlayGame);
    }
    public void MSPlayGame(Object sender, EventArgs e){
        Console.WriteLine("Who laughs the last who wins");
    }
}

这样当调用LetsGame.startPlay的时候就会调用MS.MSPlayGame.


- 实际应用
对照一下c#的GUI事件处理或者asp.net的web控件事件处理,能帮我们更好的理解委托和事件.大家一定很熟悉asp.net里下面的代码

private void InitializeComponent()
{   
   
    this.Button1.Click += new System.EventHandler(this.Button1_Click);
}

private void Button1_Click(object sender, System.EventArgs e)
{
    //do sth
}

这 就是用委托来实现事件.你可能发现我们并没有给它声明委托对象并通过event关键字来引用该委托对象,那是因为asp.net早就帮我们做好了该项工 作,其委托对象是System.EventHandler. Button1相当于上面的LetsGame的实例,是呼叫者,Button1_Click是被呼叫方法.当你click Button1后,Button1就会调用Button1_Click.

------------------------------------

 2.泛型委托

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleTry
{
    
public delegate string SampleDelegate<T,S>(T s1,S s2);
    
class Program
    {
        
/// <summary>
        
/// Main Method
        
/// </summary>
        
/// <param name="args"></param>
        static void Main(string[] args)
        {
            SampleDelegate
<stringint> d1 = new SampleDelegate<stringint>(new Test().AddStr);
            Console.Write(d1(
"My age is "23));
            Console.Read();
        }
    }

    
class Test
    {
        
/// <summary>
        
/// Test Method
        
/// </summary>
        
/// <param name="s1"></param>
        
/// <param name="s2"></param>
        
/// <returns></returns>
        public string AddStr(string s1, int s2)
        {
            
return s1 + s2;
        }
    }
}