频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

c#委托与事件心得

来源:qqread 作者: 出处:巧巧读书 2007-03-17 进入讨论组
作者:cloudjun 来源:cnblogs
c#用委托来实现事件通知机制。委托相当与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.

-杂项

我觉得这种机制和design pattern里的observer很类似,我们完全可以用observer来达到同样的效果,但是用委托更灵活,不需要定义一个interface然后所有的concrete class都实现某个方法,函数指针(委托)更灵活.

还有,委托不一定非要和事件一起用,单独用的时候就是函数指针.专题:http://www.qqread.com/csharp/v303746.html进入讨论组讨论。
收藏此文】【 】【打印】【关闭
较早的文章:C#网络编程初探(4)

较新的文章:C#与JAVA之比较(1)
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章