C#基础学习之事件的理解和应用

事件的使用和委托类似,也是分四步来实现:声明委托、定义事件、注册事件、调用事件

我们先看一下事件的定义

//定义委托
public delegate void PublishEventHandler(string msg);
//定义事件
public event PublishEventHandler OnPublish;

事件注册和取消注册是用+=和-=方法名来完成的,如

publisher.OnPublish += method;

最后就可以调用事件了

OnPublish(msg);

我们同样使用一个例子来理解事件,学习事件是怎么使用的。

我们现在完成一个发布订阅的过程,由发布者发布消息,订阅者接受处理

看示例代码

发布者类:    

public class Publisher
    {
        //定义委托
        public delegate void PublishEventHandler(string msg);
        //
        public event PublishEventHandler OnPublish;
         
        public void SendMessage(string msg)
        {
            Console.WriteLine(string.Format("发布一个消息:{0}", msg));
            //
            if (OnPublish != null)
            {
                //表示事件已注册
                OnPublish(msg);
            }
        }
    }

订阅者类    

public class Receiver
    {
        public void ReceiveMessage(string msg)
        {
            Console.WriteLine(string.Format("接收一个消息:{0}", msg));
        }
}
定义一个执行类,看事件如何调用    
public class EventExecutor
    {
        public static void Run()
        {
            Publisher publisher = new Publisher();
            string msg = "今天发工资了";
            Receiver receiver = new Receiver();
            //注册事件,订阅
            publisher.OnPublish += receiver.ReceiveMessage;
            publisher.SendMessage(msg);
        }
    }

 我们发现事件是依附于委托存在的,使用上和委托几乎相同,都是先声明再注册调用。

上面的例子我们直接使用委托实现也很简单,在Publisher类我们定义委托对象

//使用委托实现
public PublishEventHandler publishEventHandler;

调用类中如下注册

//使用委托实现
publisher.publishEventHandler = new Publisher.PublishEventHandler(receiver.ReceiveMessage);

 

那到底事件的存在意义是什么

事件其实是使用了委托链,类似对委托的一种封装,在注册事件时,我们只能通过+=Method的形式进行注册,而无法再像委托注册的时候直接给委托对象赋值。

其他的我也不太清楚哪些是委托不能完成的,还请大神指点

 

posted on 2014-11-26 16:41  One heart  阅读(191)  评论(0编辑  收藏  举报