文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#中的EventHandler观察者模式怎么实现

2023-06-29 12:09

关注

这篇文章主要介绍“C#中的EventHandler观察者模式怎么实现”,在日常操作中,相信很多人在C#中的EventHandler观察者模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中的EventHandler观察者模式怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

C# 和 java 比较:java 中使用的是接口。C# 使用委托机制,可以用时 + 运算符进行注册,直接多播。而 java 中是一般是使用一个集合来保存观察者。

一、解释

发布者(Publisher)= 被观察者(Observable) = 事件源(java中的EventObject,C#中的sender)
订阅者(Subscriber)=观察者(Observer)= 接收者(java中继承EventLister,接口, 或Observer接口, C#由于委托机制,不需要继承接口,直接按EventHandler实现回调方法)

在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由控件(如按钮和列表框)引发的事件。可使用 Visual C# 集成开发环境 (IDE) 来浏览控件发布的事件,选择要处理的事件。IDE 会自动添加空事件处理程序方法和订阅事件的代码。

EventHandler 为 C# 中的预定义委托,专用于表示不生成数据的事件的事件的处理程序方法。

public delegate void EventHandler(Object sender, EventArgs e)

二、事件具有以下特点:

发行者确定何时引发事件,订户确定执行何种操作来响应该事件。
2. 一个事件可以有多个订户。一个订户可处理来自多个发行者的多个事件。
3. 没有订户的事件永远不会被调用。
4. 事件通常用于通知用户操作(如:图形用户界面中的按钮单击或菜单选择操作)。
5. 如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。要异步调用事件,请参见使用异步方式调用同步方法。
6. 可以利用事件同步线程。
7. 在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。

实例代码

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleAppEventArgs{    public class Program    {        public static void Main(string[] args)        {            Publisher pub = new Publisher();            Subscriber sub1 = new Subscriber("sub1",pub);            Subscriber sub2 = new Subscriber("sub2", pub);            // 调用这个方法来产生事件            pub.DoSomething();            Console.WriteLine("Press Enter to close this window.");            Console.ReadLine();        }    }    /// <summary>    /// 自定义一个事件类来保存事件信息    /// </summary>    public class CustomEventArgs : EventArgs        public CustomEventArgs(string s)        private string message;        public string Message            get { return message; }            set { message = value; }    /// 广播事儿件的类    public class Publisher        //使用EventHandler<T> 声明一个事件        public event EventHandler<CustomEventArgs> RaiseCustomEvent;        public void DoSomething()            //DoSomething…………            // 你也可以再触发事件前,执行一些其他的代码            OnRaiseCustomEvent(new CustomEventArgs("Did something,hi 这是事件消息"));        protected virtual void OnRaiseCustomEvent(CustomEventArgs  e)            // 定义一个局部变量,已防止最后一个订阅者刚好在检查null后取消订阅            EventHandler<CustomEventArgs> handler = RaiseCustomEvent;            // 如果没有 订阅者(观察者), 委托对象将为null            if (handler != null)            {                // 格式化事件消息中 的字符串                e.Message += String.Format(" at {0}", DateTime.Now.ToString());                // 这是最重要的一句。                // 此时执行的  handler已经是一个多播委托(如果有多个订阅者或观察者注册)。                // 既然是多播委托,就可以依次调用各个 回调函数 (既然是回调函数,实际的执行就由订阅者类决定)。                //这里面传入一个this, 就代表 事件源(或发布者 或 被观察者 都一个意思)                handler(this, e);            }    /// 用来注册事件的类    public class Subscriber        private string id;        public Subscriber(string ID, Publisher pub)            id = ID;//注册这个动作,应该有订阅者主动进行,并且可以再后期取消注册            pub.RaiseCustomEvent += HandleCustomEvent;        // 实现回调函数。在事件发生后,执行什么样的操作。这里只是简单的打印信息。        void HandleCustomEvent(object sender, CustomEventArgs e)            //这就是实际的操作。            Console.WriteLine(id + " received this message: {0}", e.Message);}

到此,关于“C#中的EventHandler观察者模式怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯