初学事件和委托,整理一下,备忘,也给我和需要的朋友一个方便!

       我现在还是一学生,欢迎交流,指教!

一个完整的事件处理包含以下几个要素:

一:事件的激发者;

二:事件的处理者;

三:指定委托。

下面通过一个程序来分别解说他的整个使用过程(程序是从网上下的,感谢原创者,我只是在他的解说的基础上加上我的理解整理出来而已!)

***事件的激发***

在一个函数中激发一个事件:

 

       public void 玩游戏()
        {
            Console.WriteLine("小张开始玩游戏了..");
            Console.WriteLine("小张:CS好玩,哈哈哈! 我玩..");
            System.Threading.Thread.Sleep(500);
            System.EventArgs e = new EventArgs();
            OnPlayGame(e);            
        }

        protected virtual void OnPlayGame(EventArgs e)
        {
            if (PlayGame != null)
            {
                PlayGame(this, e);
            }
        }

为了便于理解可以将其简化一下:

      public void 玩游戏()
        {
            Console.WriteLine("小张开始玩游戏了..");
            Console.WriteLine("小张:CS好玩,哈哈哈! 我玩..");
            System.Threading.Thread.Sleep(500);
            System.EventArgs e = new EventArgs();            
            PlayGame(this, e);
        }

PlayGame为一个事件,定义如下:

public event PlayGameHandler PlayGame;

这样我们就可以方便的看出这个事件是怎么激发的了,

         首先,定义一个事件public event PlayGameHandler PlayGame;(PlayGameHandler是必须先定义好的一个委托public delegate void PlayGameHandler(object sender,System.EventArgs e);)

         然后,在需要的地方激发一个事件:

         System.EventArgs e = new EventArgs();            
         PlayGame(this, e);

         那个被简化掉了的函数是用于测试这个PlayGame事件是否已经被其他对象注册。因为小张类的PlayGame事件有可能没有其他类通知需要处理,那么这个代码:
 if(PlayGame != null)就探测没有对象需要发送事件通知,否则表示已经有对象需要处理这个事件,就发送事件通知,让对象进行处理。

**事件的处理者**

        public void 扣钱(object sender, EventArgs e)
        {
            Console.WriteLine("小王:好小子,上班时间胆敢玩游戏");
            Console.WriteLine("小王:看看你小子有多少钱");
            小张 f = (小张)sender;
            Console.WriteLine("小张的钱: " + f.钱.ToString());
            Console.WriteLine("开始扣钱");
            System.Threading.Thread.Sleep(500);
            f.钱 = f.钱 - 500;
            Console.WriteLine("扣完了.现在小张还剩下:" + f.钱.ToString());
        }
      这里最值得注意的是:小张 f = (小张)sender,这个代码表示让小王扣小张的钱,那么,小王扣钱的时候,必须要操作小张的对象实例。方法参数里面有个object sender对象,这个对象表示激发事件的对象,在这个程序里面就表示这个sender其实是小张,但是传递的对象类型是object,所以必须使用对象类型转换语句把sender从object转成小张,所以有了:
小张 f = (小张)sender;其他的好像就没什么值得注意的了!

**指定委托**

 // 生成小王
 小王 w = new 小王();
// 生成小账
小张 z = new 小张();

z.PlayGame += new PlayGameHandler(w.扣钱);

z.PlayGame就是开始开始声明的那个事件了,而PlayGameHandler就是定义的委托,w.扣钱就是那个事件处理函数了!

 

事实上我们可以看一下winform里面自动生成的代码如button,如果你也是初学的话,不妨自己去看看它自己生成的代码是怎么样的,应该有所帮助!

this.btn_ok.Click += new System.EventHandler(this.btn_ok_Click);

转到click的定义:

// 摘要:
//     在单击控件时发生。
 public event EventHandler Click;(也就是一个事件了)

转到EventHandler的定义:

 public delegate void EventHandler(object sender, EventArgs e);(一个委托)

转到btn_ok_Click的定义,哈哈,不用怀疑,那就是你写的事件处理代码了!

 

                                                                                                                                                                        点击跳转到我引用的出处! 

 

 

 

posted on 2008-08-16 17:00  朝阳  阅读(651)  评论(0)    收藏  举报