zoukankan      html  css  js  c++  java
  • 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的形式进行注册,而无法再像委托注册的时候直接给委托对象赋值。

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

  • 相关阅读:
    6-4.粗体标签
    [Unity3D] 如何实现点击按钮退出游戏
    [Unity3D] 载入游戏地图时背景图片随机切换 & 数字百分比进度条
    [Unity3D] 鼠标点击图片移动效果
    [3DMAX]如何将骨骼与模型绑定在一起(蒙皮) & 如何实现自动化人物模型蒙皮
    [Unity 3D]用鼠标滚轮实现镜头放大和缩放,并添加距离限制
    [Unity3D] 如何实现围绕旋转
    [Unity3D] 如何实现注视旋转
    Css 图片自适应
    Scss 定义内层class的简单写法
  • 原文地址:https://www.cnblogs.com/oneheart/p/4123647.html
Copyright © 2011-2022 走看看