RSS 2.0 Feed
2005-01 Entries
摘要:很久没发文章了,今天发一篇写了半个多月的教程,限于篇幅无法发布到首页来,目录如下: .NET 事件模型教程(一) 事件、事件处理程序概念 问题描述:一个需要较长时间才能完成的任务 高耦合的实现 事件模型的解决方案,简单易懂的 VB.NET 版本 委托(delegate)简介 C# 实现 向“.NET Framework 类库设计指南”靠拢,标准实现 .NET 事件模型教程(二) 属性样式的事件声明 单播事件和多播事件 支持多播事件的改进 .NET 事件模型教程(三) 使用接口实现回调 .NET 事件模型和 Java 事件模型的对比 事件、事件处理程序概念 在面向对象理论中,一个对象(类的实例)可以有属性(property,获取或设置对象的状态)、方法(method,对象可以做的动作)等成员外,还有事件(event)。所谓事件,是对象内部状态发生了某些变化、或者对象做某些动作时(或做之前、做之后),向外界发出的通知。打个比方就是,对象“张三”肚子疼了,然后他站在空地上大叫一声“我肚子疼了!”事件就是这个通知。 那么,相对于对象内部发出的事件通知,外部环境可能需要应对某些事件的发生,而做出相应的反应。接着上面的比方,张三大叫一声之后,救护车来了把它接到医院(或者疯人院,呵呵,开个玩笑)。外界因应事件发生而做出的反应(具体到程序上,就是针对该事件而写的那些处理代码),称为事件处理程序(event handler)。 事件处理程序必须和对象的事件挂钩后,才可能会被执行。否则,孤立的事件处理程序不会被执行。另一方面,对象发生事件时,并不一定要有相应的处理程序。就如张三大叫之后,外界环境没有做出任何反应。也就是说,对象的事件和外界对该对象的事件处理之间,并没有必然的联系,需要你去挂接。 在开始学习之前,我希望大家首先区分“事件”和“事件处理程序”这两个概念。事件是隶属于对象(类)本身的,事件处理程序是外界代码针对对象的事件做出的反应。事件,是对象(类)的设计者、开发者应该完成的;事件处理程序是外界调用方需要完成的。简单的说,事件是“内”;事件处理程序是“外”。 了解以上基本概念之后,我们开始学习具体的代码实现过程。因为涉及代码比较多,限于篇幅,我只是将代码中比较重要的部分贴在文章里,进行解析,剩余代码还是请读者自己查阅,我已经把源代码打了包提供下载。我也建议你对照这些源代码,来学习教程。[下载本教程的源代码] ……(更多、更详细内容请点击目录中的链接)……   欢迎大家批评指教!如希望转载,请务必参照本人blog公告内的声明!...[阅读全文]

posted @ | Feedback (18) |

摘要: .code { padding: 10px 10px 10px 10px; font-family: 宋体; background-color: #ececec } 通过前两节的学习,你已经掌握了 .NET 事件模型的原理和实现方式。这一节我将介绍两个替代方案,这些方案并不是推荐采用的,请尽量采用事件模型去实现。另外,在本节末尾,有一段适合熟悉 Java 语言的读者阅读,讨论了 .NET 和 Java 在“事件模型”方面的差异。 目录 使用接口实现回调 .NET 事件模型和 Java 事件模型的对比 使用接口实现回调 事件模型其实是回调函数的一种特例。像前面的例子,Form1 调用了 Worker,Worker 反过来(通过事件模型)让 Form1 改变了状态栏的信息。这个操作就属于回调的一种。 在“.NET Framework 类库设计指南”中提到了:“委托、接口和事件允许提供回调功能。每个类型都有自己特定的使用特性,使其更适合特定的情况。”(参见本地 SDK 版本,在线 MSDN 版本) 事件模型中,事实上也应用了委托来实现回调,可以说,事件模型是委托回调的一个特例。如果有机会,我会在关于多线程的教程中介绍委托回调在多线程中的应用。 这里我先来看看,如何使用接口实现回调功能,以达到前面事件模型实现的效果。 Demo 1I:使用接口实现回调。 using System; using System.Threading; using System.Collections; namespace percyboy.EventModelDemo.Demo1I { // 注意这个接口 public interface IWorkerReport { void OnStartWork(int totalUnits); void OnEndWork(); void OnRateReport(double rate); } public class Worker { ......[阅读全文]

posted @ | Feedback (11) |

摘要: .code { padding: 10px 10px 10px 10px; font-family: 宋体; background-color: #ececec } 目录 属性样式的事件声明 单播事件和多播事件 支持多播事件的改进 属性样式的事件声明 在第一节中,我们讨论了 .NET 事件模型的基本实现方式。这一部分我们将学习 C# 语言提供的高级实现方式:使用 add/remove 访问器声明事件。(注:本节内容不适用于 VB.NET。) 我们再来看看上一节中我们声明事件的格式: public event [委托类型] [事件名称]; 这种声明方法,类似于类中的字段(field)。无论是否有事件处理程序挂接,它都会占用一定的内存空间。一般情况中,这样的内存消耗或许是微不足道的;然而,还是有些时候,内存开销会变得不可接受。比如,类似 System.Windows.Forms.Control 类型具有五六十个事件,这些事件并非每次都会挂接事件处理程序,如果每次都无端的多处这么多的内存开销,可能就无法容忍了。 好在 C# 语言提供了“属性”样式的事件声明方式: public event [委托类型] [事件名称] { add { .... } remove { .... } } 如上的格式声明事件,具有 add 和 remove 访问器,看起来就像属性声明中的 get 和 set......[阅读全文]

posted @ | Feedback (14) |

摘要: .code { padding: 10px 10px 10px 10px; font-family: 宋体; background-color: #ececec } 目录 事件、事件处理程序概念 问题描述:一个需要较长时间才能完成的任务 高耦合的实现 事件模型的解决方案,简单易懂的 VB.NET 版本 委托(delegate)简介 C# 实现 向“.NET Framework 类库设计指南”靠拢,标准实现 事件、事件处理程序概念 在面向对象理论中,一个对象(类的实例)可以有属性(property,获取或设置对象的状态)、方法(method,对象可以做的动作)等成员外,还有事件(event)。所谓事件,是对象内部状态发生了某些变化、或者对象做某些动作时(或做之前、做之后),向外界发出的通知。打个比方就是,对象“张三”肚子疼了,然后他站在空地上大叫一声“我肚子疼了!”事件就是这个通知。 那么,相对于对象内部发出的事件通知,外部环境可能需要应对某些事件的发生,而做出相应的反应。接着上面的比方,张三大叫一声之后,救护车来了把它接到医院(或者疯人院,呵呵,开个玩笑)。外界因应事件发生而做出的反应(具体到程序上,就是针对该事件而写的那些处理代码),称为事件处理程序(event handler)。 事件处理程序必须和对象的事件挂钩后,才可能会被执行。否则,孤立的事件处理程序不会被执行。另一方面,对象发生事件时,并不一定要有相应的处理程序。就如张三大叫之后,外界环境没有做出任何反应。也就是说,对象的事件和外界对该对象的事件处理之间,并没有必然的联系,需要你去挂接。 在开始学习之前,我希望大家首先区分“事件”和“事件处理程序”这两个概念。事件是隶属于对象(类)本身的,事件处理程序是外界代码针对对象的事件做出的反应。事件,是对象(类)的设计者、开发者应该完成的;事件处理程序是外界调用方需要完成的。简单的说,事件是“内”;事件处理程序是“外”。 了解以上基本概念之后,我们开始学习具体的代码实现过程。因为涉及代码比较多,限于篇幅,我只是将代码中比较重要的部分贴在文章里,进行解析,剩余代码还是请读者自己查阅,我已经把源代码打了包提供下载。我也建议你对照这些源代码,来学习教程。[下载本教程的源代码] [TOP]   问题描述:一个需要较长时间才能完成的任务 Demo 1A,问题描述。这是一个情景演示,也是本教程中其他 Demo 都致力于解决的一个“实际问题”:Worker 类中有一个可能需要较长时间才能完成的方法 DoLongTimeTask: using System; using System.Threading; namespace percyboy.EventModelDemo.Demo1A { // 需要做很长时间才能完成任务的 Worker,没有加入任何汇报途径。 public class Worker { // 请根据你的机器配置情况,设置 MAX 的值。 // 在我这里(CPU: AMD Sempron 2400+, DDRAM 512MB) // 当 MAX = 10000,任务耗时 20 秒。 private const......[阅读全文]

posted @ | Feedback (50) |

摘要: 中文版:http://www.percyboy.com/w/ftb/(最近有些忙,让大家久等了。)...[阅读全文]

posted @ | Feedback (100) |