C#之Event的应用

  Unity项目中,见到了event事件,决定将它弄清楚。event事件是C#的固有属性,简单来说,就是发布者通过新建一个EventHandler对象,然后别的注册者可以注册事件到这个对象上面。当发布者需要有消息发布时,就会执行注册者注册的方法。此外,EventHandler是delegate,类似于C++的模板函数,就是符合EventHandler格式的方法都可以注册进来。

  1)注册时,直接使用+=即可,例如

publisher.RaiseCustomEvent -= HandleCustomEvent;
  2)取消时,直接使用-=即可,例如

publisher.RaiseCustomEvent -= HandleCustomEvent;
  需要注意的是,注册和取消是不需要添加参数的。

  3).Net Framework 2.0之后,推出了委托的泛型版本,即带消息时,带固定格式的消息,例如

public event EventHandler<CustomEventArgs> RaiseCustomEvent;

 

  下面贴出一个简单Demo,演示event事件是如何使用的,微软官方教程网站是点击打开链接

namespace CSharpTest
{
    //继承自框架提供的EventArgs类
    public class CustomEventArgs : EventArgs
    {
        //带个信息
        private string message;

        public CustomEventArgs(string s)
        {
            message = s;
        }

        public string Message
        {
            get { return message; }
            set {message = value; }
        }
    }

    public class Publisher
    {
        //新建event事件,这件事情是发布者做的
        public event EventHandler<CustomEventArgs> RaiseCumstomEvent;

        //执行事件
        public void DoSomething()
        {
            OnRaiseCumstomEvent(new CustomEventArgs("Did Something"));
        }

        //具体执行事件的方法
        protected virtual void OnRaiseCumstomEvent(CustomEventArgs e)
        {
            EventHandler<CustomEventArgs> handler = RaiseCumstomEvent;

            if(handler != null)
            {
                e.Message += string.Format(" at {0}",DateTime.Now.ToString());

                //执行所有注册的事件
                handler(this,e);
            }
        }
    }

    //注册者类
    class Subscriber
    {
        private string id;
        public Subscriber(string ID,Publisher pub)
        {
            id = ID;

            //注册事件, += 之后按tab自动出这个方法,约定俗成的名字
            pub.RaiseCumstomEvent += pub_RaiseCumstomEvent;
        }

        //此处的sender对象即是发布者对象,e是发布者发过来的信息
        public void pub_RaiseCumstomEvent(object sender, CustomEventArgs e)
        {
            Console.WriteLine(id + " received this message:{0}",e.Message);
        }
    }

    class Program
    {
        static void Main(String[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub1 = new Subscriber("sub1",pub);
            Subscriber sub2 = new Subscriber("sub2", pub);
            Subscriber sub3 = new Subscriber("sub3", pub);

            pub.DoSomething();

            //取消一个事件
            pub.RaiseCumstomEvent -= sub3.pub_RaiseCumstomEvent;

            Console.WriteLine("-------------------------------");

            pub.DoSomething();


        }
    }
}

  以后对event和delegate的理解加深以后再来补充。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值