c# 委托和事件理解 三种方式

.
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.

另外,在使用的过程中我们还发现了, 原来还可以用匿名委托的方式来触发事件的。例如:

            EventClass ec = new EventClass();
         
            ec.custom1 += delegate(object sender,EventArgs e) { Console.Write("这个是委托类型的事件处理 \n"); };
            ec.Callcustom1();
            Console.ReadLine();
        }

        public static void Custom1Event(object sender, EventArgs e)
        {
            Console.BackgroundColor = System.ConsoleColor.Red;
            Console.ForegroundColor = System.ConsoleColor.DarkYellow;
            Console.Write("这个是委托类型的事件处理 \n");

        }

    }

    public class EventClass
    {
        public delegate void CustomEventHandler(object sender, EventArgs e); //定义委托对象
        public event CustomEventHandler custom1;    //实例化委托对象
        

        public void Callcustom1()
        {
            custom1(this, EventArgs.Empty);
            Console.Write("this is call custom1\n");

        }
    }

还有一种就是在c#3.0 的版本中有的新特性,就是使用lambda语言,用的是=>标识,它是匿名委托的一种简化形式,这里只给出它的表达式,具体的话请查看相关的文档,ArgumentsToProcess=>StatementsToProcessThem,参数可以是从空到多个参数。

-杂项

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

还有,委托不一定非要和事件一起用,单独用的时候就是函数指针.

转载于:https://www.cnblogs.com/xiaoxia/archive/2009/08/31/1557652.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值