`
warlock333
  • 浏览: 5119 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

浅析C#之——Observer, Delegate和event(3)

    博客分类:
  • C#
阅读更多

接下来说一下event

event的简述:

event是C#特有的一个修饰符关键字语法本质是进行一个转换,实现对delegate的进一步封装。

 

event的简单使用方法:

之前介绍过了delegate,那么event的语法其实很简单,就只要在之前的Observer_delegate.cs中的delegate申明行中加入一个event修饰符即可,其它地方一个字都不用改就能编译通过运行结果毫无差别。

 

//private ReceiverList receiverList; //has a delegate;	
private event ReceiverList receiverList; //申明一个事件;

 

event的事实真相:

用ILDasm查看经过编译后的Observer_event.exe,结果如下:



可以看到,编译器是将event修饰过的那一行代码转换成了一个私有委托的申明和两个对其进行add和remove操作的函数,最后还有一个针对私有委托的包装。

私有委托的申明不说了,就等于是这样一行代码:

 

 private ReceiverList receiverList = null; 

 

add_receiverList()和remove_receiverList()方法的本质是对Delegate的Combine方法和Remove方法进行了封装,以循环和对CompareExchange的调用实现了一种线程安全的添加和移除委托的方式。

而最后的那个包装:



 我们可以将其与一个属性的IL代码进行比较:


可以发现两者非常相似。所以我的理解是,event修饰符所做的,除了帮我们在底层申明私有委托字段和线程的add,remove方法外,还将委托字段做成类似于属性的样子,类内部可以随意访问,类外部默认只能通过那两个函数访问(当然你也可以在类申明时添加自己对于委托字段的操作方法供外部调用,如我们在代码中所写的addReceiver和removeReceiver方法)。

这也可以看出,C#是希望我们能将event当做一个类的属性来看待,默认支持的操作也是只允许该属性作为+=和-=操作符的左值出现,一切都是为了简化。

 

event的应用——Eventlistener设计模式:

先前提到过一个Observer设计模式。我原本以为event也是多用于这种设计模式的,后来才发现,其实C#提出这个字段的本意更应该是推崇Event-Listener事件侦听设计模式。

两者没有进行过深入的比较分析,大致了解了一下发现,Observer和Eventlistener非常相像:Observer中主题和观察者对应于Eventlistener中的事件源和事件侦听者。

如果将发送消息的一方成为服务端,接收消息的一方称为客户端的话,那么Observer给我的感觉就是更重视服务端,更多的操作会在服务端完成,而则Event-Listener更重视客户端;

但其实这也只是我比较浅薄的感觉,还望高人指点蛤……

 

接下来打算用Eventlistener设计模式重新设计一下先前的机制,因为模式变了,所以类和方法名会做一些变化以更切合设计模式的表现。

 

// TODO。。。。。。。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 9 KB
  • 大小: 2.6 KB
  • 大小: 2.3 KB
分享到:
评论

相关推荐

    Observer模式

    Observer模式,也被称为“发布-订阅”模式,是软件设计模式中的行为模式之一。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。Observer模式是实现...

    C#范例——研究生信息系统,提供详细的代码,控件,适合C#初学者借鉴!

    【C#范例——研究生信息系统】是一个专门为C#初学者设计的学习资源,旨在帮助他们理解和掌握C#编程语言在实际项目中的应用。这个系统可能是针对研究生教育管理的一个完整解决方案,涵盖了学生信息管理、课程管理、...

    深入浅出设计模式(中文版电子版)

    5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 5.7.7应用情景 248 5.8StatePattern(状态模式) 248 5.8.1定义 248 5.8.2现实例子——心情...

    C#中的委托、事件和Observer设计模式使用方法示例

    在C#编程语言中,委托、事件和Observer设计模式是构建高效、可扩展的应用程序的重要概念。这篇文档将深入探讨这些主题,以帮助你更好地理解它们的用途和实现方式。 首先,我们来看委托(Delegate)。委托在C#中相当...

    iOS基础——通知代理之NSNotificationCenter、Delegate

    在iOS开发中,通知代理是实现对象间通信的重要机制,主要分为两个方面:NSNotificationCenter和Delegate。这两种方式都允许一个对象监听并响应其他对象的事件,但它们各自有其特性和适用场景。 首先,我们来详细...

    详解C#委托,事件,Observer设计模式

    在C#中,事件和委托是实现Observer模式的有效工具。 通过事件,发布者可以在特定条件下触发通知,而订阅者则可以通过添加事件处理程序来响应这些通知。这种方式不仅降低了对象之间的耦合度,还提高了系统的灵活性和...

    C# 委托和事件在.NET Framework详解

    在C#中,委托可以用于实现Observer设计模式,从而使得代码更加灵活和可扩展。 委托和事件是C#中的重要概念,广泛应用于各个领域。通过了解委托和事件的概念、应用场景和设计模式,可以提高开发效率和代码质量。

    C#中的委托delegate用法的示例详解

    【C#中的委托delegate用法的示例详解】 在C#编程语言中,委托是类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在类的字段中,以便稍后调用。这种特性使得委托成为C#中实现事件处理和回调机制...

    C#设计模式(17)——观察者模式(Observer Pattern).pdf

    从生活中的例子可以看出,只要对订阅号进行关注的客户端,如果订阅号有什么更新,就会直接推送给订阅了的用户。从中,我们就可以得出观察者模式的定义。  观察者模式定义了一种一对多的依赖关系,让多个观察者对象...

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

    Observer-based H∞ Event-triggered Control for Piecewise Affine Systems

    线性矩阵不等式(LMI)是数学中处理线性矩阵之间关系的一种方法,因其在处理约束条件和优化问题时具有方便易用的特点,常被用于控制系统的稳定性分析和控制器设计。 蒋永豪与吴炜的这篇论文中,结合了观测器理论、...

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    在C#中实现观察者模式,通常涉及两个关键角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它维护了一个观察者列表,并提供方法供观察者注册和注销;观察者则表示对主题状态变化感兴趣的实体,它们...

    重温Observer模式--热水器·改

    在这个“重温Observer模式--热水器·改”的讨论中,作者将再次阐述如何不依赖C#的委托和事件来实现Observer模式,而是采用GOF(GoF,Gang of Four)的经典方式。 在Observer模式中,有两个核心角色:Subject(主题...

    Observer设计模式实例

    Observer设计模式,也被称为“发布-订阅”(Publish-Subscribe)模式或“依赖倒置”模式,是软件设计中的一种行为模式。...在Java、C#、Python等面向对象语言中,都有内置的Observer支持,使得实现这一模式更加便捷。

    委托实现C#观察者模式简单例子

    3. **事件(Event)**:在C#中,事件是基于委托的特殊类型,用于在类之间安全地发布通知。 4. **委托(Delegate)**:是C#中的多播委托,它可以引用多个方法,相当于事件处理程序的列表。 现在,让我们逐步构建这个...

    《设计模式--基于C#的工程化实现及扩展》.(王翔)_《0528》.rar

    行为型模式则关注对象之间的交互和职责分配,如策略模式(Strategy)、观察者模式(Observer)和责任链模式(Chain of Responsibility)等,它们有助于提高代码的灵活性和可扩展性。 在C#中,设计模式的实现往往...

Global site tag (gtag.js) - Google Analytics