C# 事件

事件其实很简单,当然是在了解了之后。定义就不说了,可以理解为一种特殊的、进阶的委托。相信大家都用过winform里面的事件,比如Button的Click事件,当我们单击按钮的时候,触发事件,执行相关的操作。

例子也很简单,员工A每次玩手机的时候,都会被员工B数落一通。我们定义了两个类,员工A,员工B

class I
        {
            string name;

            public I(string name)
            {
                this.name = name;
            }

            public void PlayPhone()
            {
                Console.WriteLine("员工A玩手机了。。。。");
                Console.WriteLine("可是当他刚打开手机屏幕的时候,");

                //如果有人订阅了该事件,则执行该事件
                if (PlayPhoneEvent!=null)
                {
                    PlayPhoneEvent();
                }
            }
            //声明一个委托
            public delegate void PlayPhoneEventHandler();
            //声明一个事件,注意事件是声明在发布者的类中
            public event PlayPhoneEventHandler PlayPhoneEvent;
class SomeBody
        {
            string name;
            public SomeBody(string name)
            {
                this.name = name;
            }

            public void Shout()
            {
                Console.WriteLine(name+"说:"+"怎么你一天到晚都在玩手机!?");
            }
        }

调用:

 static void Main(string[] args)
        {
            I i = new I("衰仔");

            SomeBody someBody = new SomeBody("偷偷看你的人");

            //i.PlayPhoneEvent += new PlayPhoneEventHandler (someBody.Shout);
            //上面的是C#1中的老式写法,下面的是新的写法:方法组转换?

            i.PlayPhoneEvent += someBody.Shout;

            i.PlayPhone();

            Console.ReadLine();
        }

下面是执行结果:

在设计模式中,有一种模式叫做观察者模式,其实就是我们所说的事件。类I就相关于发布者,SomeBody就相当于是观察者或者叫订阅者。

我们见到的事件,都是含参数的,比如Button的Click事件:

private void Button1_Click(object sender, EventArgs e)

其中,参数sender类型是sender,表示发送消息的对象(发布者,在本例中,是指类I);

参数e类型是EventArgs,可以用作基类让其他类继承,用来传递一些额外的信息。

现在继续拿上面的例子,加入这两个参数,看看如何使用这两个参数。

class I
        {
            string name;

            public I(string name)
            {
                this.name = name;
            }

            public void PlayPhone()
            {
                Console.WriteLine("员工A玩手机了。。。。");
                Console.WriteLine("可是当他刚打开手机屏幕的时候,");

                //如果有人订阅了该事件,则执行该事件
                //加入了参数以后,类I以及它的name字段通过该事件被传递给了订阅事件的人
                if (PlayPhoneEvent!=null)
                {
                    EventArgs e = new MyEventArgs() { Name=this.name};
                    PlayPhoneEvent(this,e);
                }
            }
            //声明一个委托
            public delegate void PlayPhoneEventHandler(object sender,EventArgs e);
            //声明一个事件,注意事件是声明在发布者的类中
            public event PlayPhoneEventHandler PlayPhoneEvent;
        }
 class SomeBody
        {
            string name;
            public SomeBody(string name)
            {
                this.name = name;
            }

            public void Shout(object sender, EventArgs e)
            {
                MyEventArgs args = e as MyEventArgs;
                //使用到了e参数:
                Console.WriteLine(name+"说:"+ args.Name+",怎么你一天到晚都在玩手机!?");
            }
        }

新增了一个类MyEventArgs,继承自EventArgs,用来传参:

 class MyEventArgs:EventArgs
        {
            private string name;

            public string Name
            {
                get { return name; }
                set { name = value; }
            }
        }

调用:

static void Main(string[] args)
        {
            I i = new I("衰仔");

            SomeBody someBody = new SomeBody("偷偷看你的人");

            i.PlayPhoneEvent += someBody.Shout;

            i.PlayPhone();

            Console.ReadLine();
        }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值