一个平凡菜鸟的C#琐碎总结 ----- 事件

注:希望大家给点批评意见,刚刚写博客,需要老鸟的支持和鼓励啊


 

事件(event)

1、 事件简单理解

 可以理解为对象对外部情况作出相应的响应,如:用户在UI中单击自定义控件时,该控件会触发click事件。

2、 事件的工作方式

(1)       首先,必须在类中声明事件并确定将要使用的委托和参数

(2)       其次必须定义在触发事件时要调用的委托

(3)       最后,必须设计事件参数类,该参数类的实例会将信息传递给调用的方法

理解以上三点可以用这个例子:小孩子玩气球(气球类),气球有最大容积当充气超出容积会爆炸(爆炸事件),当小孩听到爆炸声吓哭了。

class Program

    {

        public  class Balloon

        {

            private  readonly int_Max容积;

            private  int _当前容积;

            public   int 最大容积

            {

                get { return this._Max容积; }

            }

            //构造函数

            public   Balloon(int 最大容积)

            {

                this._Max容积 = 最大容积;

            } 

            //第二步:在类的内部,定义它有事件

            //事件定义,其实事件就是委托

            //调用事件时,必须判断事件是否为空

            public   event    爆炸EventHandler 爆炸   event;//事件关键字+委托名+事件名

            //充气方法

            public  void 充气(int 充气体积)

            {

                this._当前容积 += 充气体积;

                if (this._当前容积>this.最大容积)

                {

                    //触发爆炸事件,并通知别人气球爆炸了

                    //判断是不是有注册过事件的处理程序

                    if (this.爆炸event!=null)

                    {

                        //激发事件

                        this.爆炸event();                       

                    }                   

                }

            }      

       }

        //第一步:可以让类具有时间,使用类发生事件时外部可以根据本委托处理事件

        public  delegate void  爆炸EventHandler();//事件处理程序 

        public   class  小孩

        {

            private   Balloon _ball;           

            public  小孩(Balloon ball)

            {

                this._ball = ball;

                //第三步:注册事件

                //注册时间的处理程序,小孩会处理打气事件

                //注册:事件源名+=new 时间委托类型(事件处理方法);            

                this._ball.爆炸event += new爆炸EventHandler(this.听到气球爆炸);

                this._ball.爆炸event += new爆炸EventHandler(_ball_爆炸event);                    

            } 

            void_ball_爆炸event()

            {

                Console.WriteLine("小孩子吓哭了!");

            }

            public   void 打气(int m)

            {

                this._ball.充气(m);

            }

            public  void 听到气球爆炸()

            {

                Console.WriteLine("处理者:气球爆炸了");

            }

        }

        static  void Main(string[]args)

        {

            Balloonball = new Balloon(20);

            小孩 boy1 = new小孩(ball);

            boy1.打气(5);

            boy1.打气(5);

            boy1.打气(5);

            boy1.打气(5);

            boy1.打气(5);       

        }

}

通过以上可总结出:使用事件的一般步骤(以上例为例子):

第一步:定义处理事件的委托,也即事件的处理程序;

 如:public delegate void  爆炸EventHandler();

第二步:在类的内部定义事件,指定事件处理的委托类型,也即定义事件

  如: public event 爆炸EventHandler 爆炸event;//事件关键字+委托名+事件名

第三步:在类内部在适当的时候触发事件,通俗的说是调用事件,类似于调用委托;

        如:if (this._当前容积>this.最大容积)

            {    

                    if (this.爆炸event!=null)

                    {

                        this.爆炸event();                       

                    }

          }

 

第四步:再类的外部(也可以在内部)注册类的事件处理程序。

//注册:事件源名+=new 时间委托类型(事件处理方法);

this._ball.爆炸event += new 爆炸EventHandler(this.听到气球爆炸);

this._ball.爆炸event += new 爆炸EventHandler(_ball_爆炸event);

3、  简单的事件原理我们应该通过上面的例子明白了,下面我们深入了解下:(简单介绍小时间参数类EventArgs)

加入我们还以上例子为标准,我们提出这样一个需求:小孩子吓哭的同时想知道爆炸的时间?该如何解决?

其实很简单,只需在注册事件委托时候加入一个需要的参数即可,改动的地方如下:

       public delegate void 爆炸EventHandler(DateTime  dt);

            void_ball_爆炸event(DateTime dt)

            {

                Console.WriteLine("小孩子吓哭了!");

            }

            public   void 打气(int  m)

            {

                this._ball.充气(m);

            }

            public    void   听到气球爆炸(DateTime  dt)

            {

                Console.WriteLine("处理者:气球爆炸了,爆炸时间是:{0}",dt);

            }

显然这个问题解决了,那么加入又增加了需求,不仅要知道气球爆炸的时间还想知道,爆炸的地点等,那么我们还需继续改动,若以后有更多的参数,我们就得不断地改动很多地方,岂不是很累?那么该怎么办呢?很显然,利用面向对象的思想,把委托的参数抽象成一个类,即可解决,也即形成了所谓的事件参数类。

    //事件参数类

public class BalloonEventArgs

     {

            privateDateTime dt; 

            publicDateTime Dt

            {

                get { return dt; }

                set { dt = value; }

            }

            private   string address; 

            public   string Address

            {

                get { return address;}

                set { address = value;}

            }

            public   BalloonEventArgs(DateTime dt1, string add)

            {

                this.Dt = dt1;

                this.address = add;               

            }

   }

这样以后如果再有什么参数要加入,直接修改类里面的字段即可,不必修改每个委托参数和方法。完整代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text; 

namespace ConsoleApplication1

{

    classProgram

    {

        public   class Balloon

        {

            private   readonly int_Max容积;

            private   int _当前容积;

            public    int 最大容积

            {

                get { return this._Max容积; }

            }

            //构造函数

            public   Balloon(int 最大容积)

            {

                this._Max容积 = 最大容积;

            }

            public   event 爆炸EventHandler 爆炸event;//事件关键字+委托名+事件名

           public    void 充气(int 充气体积)

            {

                this._当前容积 += 充气体积;

                if (this._当前容积 > this.最大容积)

                {                  

              if (this.爆炸event != null)

             {

                BalloonEventArgs arg = newBalloonEventArgs(DateTime.Now,"南阳理工学院");

                  this.爆炸event(arg); 

             } 

               }

            } 

        }

       public delegate void 爆炸EventHandler(BalloonEventArgse);

       public   class 小孩

        {

            private   Balloon _ball;

            public    小孩(Balloon ball)

            {

                this._ball = ball;

                this._ball.爆炸event += new爆炸EventHandler(this.听到气球爆炸);

                this._ball.爆炸event += new爆炸EventHandler(_ball_爆炸event);

            } 

            void_ball_爆炸event(BalloonEventArgs e)

            {

                Console.WriteLine("小孩子吓哭了!");

            }

            public    void 打气(int m)

            {

                this._ball.充气(m);

            }

            public   void 听到气球爆炸(BalloonEventArgse)

            {

                Console.WriteLine("处理者:气球爆炸了,爆炸时间是:{0},爆炸地点是:{1}",e.Dt,e.Address);

            }

        }

        public  class  BalloonEventArgs

        {

            private   DateTime dt; 

            public   DateTime Dt

            {

                get { return dt; }

                set { dt = value; }

            }

            private   string address; 

            public   string Address

            {

                get { return address;}

                set { address = value;}

            }

            public   BalloonEventArgs(DateTime dt1, string add)

            {

                this.Dt = dt1;

                this.address = add;               

            }

        }

        static   void Main(string[]args)

        {

            Balloonball = new Balloon(20);

            小孩 boy1 = new小孩(ball);

            boy1.打气(5);

            boy1.打气(5);

            boy1.打气(5);

            boy1.打气(5);

            boy1.打气(5);

        }

    } 

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值