当前位置: 首页 > wzjs >正文

申请建设银行官方网站上海优化网站关键词

申请建设银行官方网站,上海优化网站关键词,深圳品牌营销型网站建设,莱芜钓鱼网站在C#编程语言中,事件(Event)是一个非常重要的概念,它提供了一种松耦合的方式,让对象间能够通知彼此,而无需直接联系。事件的使用可以让我们的代码更加灵活、可扩展且易于维护。 事件可以视作委托的实例&…

        在C#编程语言中,事件(Event)是一个非常重要的概念,它提供了一种松耦合的方式,让对象间能够通知彼此,而无需直接联系。事件的使用可以让我们的代码更加灵活、可扩展且易于维护。

        事件可以视作委托的实例,因此熟悉委托的使用对理解事件是有帮助的(如果学过C语言,委托就相当于定义一个指向函数的指针类型,事件就相当于指向函数的指针变量);不熟悉委托也不影响本文的阅读。

        本文将通过一个经典的生活案例“闹钟一响,打工人就要起床了”来讲解C#中事件(Event)的基本概念和使用方法。

一、事件的基本概念

        通过事件,可以让一个类(发布者c1)向另一个类(订阅者c2)发出通知,告诉它某个特定操作已经发生。

        事件的核心问题是:如何用发布者c1中的方法f1去调用订阅者c2中的方法f2。

        基本的思路是:在c1中定义一个指向f2方法的变量v,然后在f1中调用v。这样就实现了通过c1中的方法f1来调用c2中的方法f2。

        我给概括为以下几个要素:

2个类:发布者、发送者 → c1订阅者、接收者 → c2
2个方法:触发事件的方法 → f1(发布者)事件的处理方法 → f2(订阅者)
1个变量:事件 → v(在c1中定义,但不在c1中赋值)
4个关键:事件的类型 → q1事件的赋值 → q2事件的触发 → f2的调用 → q3触发的调用 → f1的调用 → q4

二、经典案例:“闹钟响了,打工人就要起床了”

用“闹钟响了,打工人就要起床了”作为一个现实中的例子,来模拟C#中的事件。假设我们有一个闹钟(发布者)和一个打工人(订阅者)。每当闹钟响起时,打工人就要起床上班了。这个过程中的关键是,打工人并不直接控制闹钟,而是通过事件来接收到闹钟响起的通知,从而作出反应。

三、用C#模拟“闹钟响了,打工人就要起床了”

下面是实现这个经典案例C#代码:

using System;namespace Demo
{class Program{static void Main(string[] args){Alarms alarm = new Alarms();Workers worker = new Workers();alarm.OnRingSound = worker.getupWorker;     //4个问题之q2→事件的赋值Console.Write("请输入闹钟参数(表示闹钟响的次数):");uint nClock = Convert.ToUInt16(Console.ReadLine());alarm.ringAlarm(nClock);                    //4个问题之q4→触发的调用→f1的调用Console.ReadLine();}}public class Alarms                                 //2个类之c1:发布者{public delegate void RingEvent();               //4个问题之q1→事件的类型public RingEvent OnRingSound;                   //1个变量之事件vpublic void ringAlarm(uint ringKind)            //2个方法之f1:触发事件的方法{Console.Write($"闹钟响{ringKind}次了。");OnRingSound();                              //4个问题之q3→事件的触发→f2的调用}}public class Workers                                //2个类之c2:订阅者{public void getupWorker()                      //2个方法之f2:事件的处理方法{Console.WriteLine($"打工人,起床!");}}
}

 四、为什么使用事件?

        在进行事件的赋值时,使用+=符号,而不是直接使用=符号,或者赋值一个空引用,这些操作会对事件的安全性造成威胁。

        为了解决这个问题,C#提供了专门的事件处理机制,以保证事件订阅的可靠性。事件通过在委托声明中添加event关键字来实现,如下所示:

public event RingEvent OnRingSound;

此时,以下代码会出现编译错误:

alarm.OnRingSound = worker.getupWorker;  // 编译错误:不能直接赋值alarm.OnRingSound = null;                // 编译错误:不能直接赋值为null

而通过订阅事件时,可以使用+=来注册事件处理方法:

alarm.OnRingSound += worker.getupWorker;     // 正确:订阅事件alarm.OnRingSound -= worker.getupWorker;     // 正确:取消订阅事件

下面是“event”正统代码

using System;namespace Demo
{class Program{static void Main(string[] args){Alarms alarm = new Alarms();Workers worker = new Workers();worker.subscribeToRing(alarm);              //类作为实参进行传递时是地址传递Console.Write("请输入闹钟参数(表示闹钟响的次数):");uint nClock = Convert.ToUInt16(Console.ReadLine());alarm.ringAlarm(nClock);                    //4个问题之q4→触发的调用→f1的调用Console.ReadLine();}}public class Alarms                                 //2个类之c1:发布者{public delegate void RingEvent();               //4个问题之q1→事件的类型public event RingEvent OnRingSound;             //1个变量之事件vpublic void ringAlarm(uint ringKind)            //2个方法之f1:触发事件的方法{Console.Write($"闹钟响{ringKind}次了。");OnRingSound();                              //4个问题之q3→事件的触发→f2的调用}}public class Workers                                //2个类之c2:订阅者{public void subscribeToRing(Alarms a) {a.OnRingSound += getupWorker;               //4个问题之q2→事件的赋值}public void getupWorker()                       //2个方法之f2:事件的处理方法{Console.WriteLine($"打工人,起床!");}}
}

进一步概括

2个类:发布者、发送者 → c1订阅者、接收者 → c2
2个方法:触发事件的方法 → f1(发布者,c1中)事件的处理方法 → f2(订阅者,c2中)
1个变量:事件 → v(在c1中定义,在c2中赋值)
4个关键:事件的类型 → q1           → c1中事件的赋值 → q2           → c2中事件的触发 → f2的调用 → q3 → c1中触发的调用 → f1的调用 → q4 → c1、c2外
发布者的实例化
订阅者的实例化订阅者订阅
4个问题之q4→触发的调用→f1的调用2个类之c1:发布者
{4个问题之q1→事件的类型1个变量之事件v2个方法之f1:触发事件的方法{4个问题之q3→事件的触发→f2的调用}
}2个类之c2:订阅者
{订阅的方法{4个问题之q2→事件的赋值}2个方法之f2:事件的处理方法{}
}

五、总结

        通过这个经典案例“闹钟响了,打工人就要起床了”,我们可以看到事件如何使得C#程序中的各个部分保持松耦合,发布者与订阅者之间并不直接依赖,而是通过事件机制进行通信。这种设计使得我们的代码更加灵活和可扩展。

        后续的系统性学习可以看【C#从入门到精通(第6版)】的《17.5 事件》或【叩响C#之门】的《16.4 事件处理机制》。

参考

清华大学出版社-图书详情-《C#从入门到精通(第6版)》

叩响C#之门 (豆瓣)

C# 事件(Event) | 菜鸟教程

C#事件--全网最全+全网最易理解-CSDN博客

ChatGPT | OpenAI


文章转载自:

http://n6Qbs7eA.yxgqr.cn
http://dGPb8eGH.yxgqr.cn
http://NoGxVBmg.yxgqr.cn
http://If0S4TBJ.yxgqr.cn
http://AYuN1E2c.yxgqr.cn
http://NrtlUkE3.yxgqr.cn
http://ZU9AVpyD.yxgqr.cn
http://a9Z23Rda.yxgqr.cn
http://wWPAHq0i.yxgqr.cn
http://IOv0jEzH.yxgqr.cn
http://vTY0Hxlt.yxgqr.cn
http://KTw24w4s.yxgqr.cn
http://tBLcdzJU.yxgqr.cn
http://5PTvGDC8.yxgqr.cn
http://Y9eRVL7V.yxgqr.cn
http://TznuCs2p.yxgqr.cn
http://R2TFHg8t.yxgqr.cn
http://CYpzZ9vq.yxgqr.cn
http://vnkM2hxw.yxgqr.cn
http://T0uGd0MS.yxgqr.cn
http://Hj3LjqUf.yxgqr.cn
http://9ezRauh5.yxgqr.cn
http://SU7iUoPn.yxgqr.cn
http://FHTt9TrW.yxgqr.cn
http://T6MMt9hU.yxgqr.cn
http://hpIbL0C9.yxgqr.cn
http://SYR4diqG.yxgqr.cn
http://39t57f4d.yxgqr.cn
http://JV11pJR9.yxgqr.cn
http://dbd3PHcx.yxgqr.cn
http://www.dtcms.com/wzjs/696975.html

相关文章:

  • 推荐优秀的企业网站设计清河做网站哪家好
  • 个人网站开发协议东莞seo黑帽培训
  • 可以做英语题的网站怎么样做个网站
  • 英语网站建设公司怎么做交易猫假网站
  • 凌云县 城市建设 网站wordpress这个博客
  • 付网站首期合同款怎么做分录移动网站设计与制作
  • 做动图的网站去掉wordpress顶部
  • 网页制作工具按其制作方式可分为台州seo优化公司
  • ui网站界面设计模板注册网站地址
  • 制作一个网站需要哪些步骤珠宝行网站建设方案
  • 263云通信官方网站深圳网站建设公司业务招聘
  • wordpress 置顶调用wordpress百度seo插件
  • 绵阳城乡住房建设厅网站wordpress网站关键字
  • 宜宾建设网站聊城大型门户网站建设
  • 设计购物网站广州冼村很有钱吗
  • 电子商务网站建设选择女教师网课入侵录屏冫
  • 网站用的服务器怎么手动更新wordpress
  • 网站设计的研究方案管理系统软件
  • 建设地方性综合门户网站大致多少钱?要多大的流量?网址大全2345 下载这?
  • 垂直网站建设的关键因素网页设计与制作教程第二版教材
  • wordpress如何设置导航需要优化的网站有哪些?
  • 做网站必须认证吗无锡 网站建设
  • 爱站网官网查询域名专业网站制作哪家专业
  • 龙潭古镇网站建设上海公司网站设
  • 八度 网站建设Wordpress 自用主题 免费 分享
  • 网站面包屑导航网络营销策划的方法
  • 宜昌 医院 网站建设拖拽式建站平台
  • 企业定制app湘潭关键词优化公司
  • 如何给网站添加cnzz贪玩游戏原始传奇官网
  • 中国空间站24小时直播入口网站做广告如何做帐