C# 入门(10) 事件(event)

C#的事件

参考书籍: 《C#图解教程》

  事件这东西呢,其实就是观察者模式。事件在很多框架里面都有,例如Andriod,QT5(信号槽),Cocos2d-x,Unity3d,一般的GUI如按钮,编辑文本,等等都是用事件的原理来响应程序的。


发布者(publisher)和订阅者(subscriber)

  • 发布者(publisher),发布某个事件的类或结构。
  • 订阅者(subscriber),注册在事件发生时得到通知的类或结构。
  • 事件处理程序(event handler),订阅者收到通知时要执行的方法。
  • 触发(raise)事件,就是发布通知(依次执行委托列表的方法)。

发布者和订阅者

  简单的说,如果我要实现点击一个按钮后,画布上就出现一张图片。那就是画布类(订阅者)有一个显示图片的方法(事件处理程序),把这个方法添加到按钮(发布者)的事件的委托里,当按钮被点击(触发事件),就执行事件里面的委托,这委托里面就会执行显示图片的方法。如下图。

namespace MyEvent
{
    //发布者
    class MyButton
    {
        //EventHandler是系统推荐的事件处理委托,也可以自己写。
        public event EventHandler ButtonClickedEvent;   

        public void OnButtonClicked()
        {             
            //触发事件,第一个参数是触发事件的对象的引用,第二个参数是用来传你要的处理数据。
            ButtonClickedEvent(this, null);
        }
    }

    //订阅者
    class MyCanvas
    {
        private string Picture = "i am a picture!";

        public MyCanvas(MyButton myBtn)
        {
            //订阅事件
            myBtn.ButtonClickedEvent += ShowPicture;
        }

        //事件处理程序,签名要和委托的前面匹配。
        void ShowPicture(object source,EventArgs e)
        {
            Console.WriteLine(Picture);
        }

    }


    class Program
    {
        static void Main()
        {
            MyButton myButton = new MyButton();
            MyCanvas myCanvas = new MyCanvas(myButton);

            myButton.OnButtonClicked();

            Console.ReadKey();
        }
    }
}

运行结果:i am a picture!

至于EventHandler这个系统的标准委托类型还有EventArgs传递数据类自己看书吧。《C#图解教程》P262。


事件访问器

  类似与属性,事件访问器有两个,add(+=)和remove(-=),同样有个叫value的隐式参数。
  

public event EventHandler Counted
{
    add
    {
        ...    //执行+=运算符代码
    }

    remove
    {
        ...    //执行-=运算符代码
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值