C#事件理解
C#和JAVA有许多相似的地方,设计思想差不多,语法及其相像,均传承自面向对象设计思想,灵感来自C++并取其精华去其“糟粕(二字持保留意见)”,中间语言、解释执行、一次编译、到处执行,出身豪门算得上是表兄弟关系,各自拥有庞大的拥趸,两种语言在发展的道路上你追我赶相互借鉴相互学习相互渗透,至于谁的IDE更强大对于一个用了二十年vim编辑器的人来说实在无从评判,强大到让人内牛满面~
C#语言中关于事件(event)结合代理(delegate)实现对象状态变更时的通知机制,总感觉这种处理有点过于复杂化了,但既然人家这么设计必定有人家的道理,相信并向人家学习而不急于批判和否定才能让自己进步的更快,个人觉得这种处理大概是来自于视窗系统独有的对各个控件事件集中快速响应的机制吧,这可能也是从事前后端开发关注点的差异,前端重人机交互当然交互的核心就是不确定时间属性和状态的事件,后端重触发每个事件的发生基本都是预定义且流程化构建好的,所以接下来尝试理解和解读一下C#的事件。
第一步:声明一个代理,这个代理可以是系统的也可以是自定义的。
public delegate void MyDelegate(); // 声明无参无返回值代理
public delegate bool MyDelegate(int k, int v); // 声明有参有返回值代理
第二步:创建一个包含该代理事件的对象,对象中调用代理实现事件的处理。
public class MyArrayList : ArrayList
{
public event MyDelegate MyChanged; // 声明代理事件
public override void Add(object o) // 覆盖父类方法
{
base.Add(o); // 调用父类方法
OnChanged(); // 调用事件函数
}
protected virtual void OnChanged()
{
if (null != MyChanged) MyChanged(); // 代理触发事件
}
}
第三步:创建一个类,将事件和代理绑定到一起,a、类构造时以包含代理事件对象作为入参,b、“+=”运算符实现绑定,c、在代理中传入类成员函数。
public class MyEvent
{
private MyArrayList list;
public MyEvent(MyArrayList l)
{
list = l;
list.MyChanged += new MyDelegate(ListChanged); // 绑定事件
}
private void ListChanged() // 被绑定事件
{
System.Console.WriteLine("ListChanged ...");
}
}
第四步:创建含有事件的类的实例,创建含有方法的类的实例。
public class MyTest
{
public static void Main()
{
MyEvent me = new MyEvent(new MyArrarList());
me.Add("object_1");
}
}
仔细研究发现,代理相当于C\C++中的函数指针,但功能更强大,使用更安全,代理实例在创建的时候,代理会把传给它的参数传给绑定的方法,而且代理可以通过“+=”运算符搭载更多的方法,下面是对比C\C++函数指针的用法。
char* (*pFun)(char*) = NULL;
pFun = GtCodeUtf8ToGB2312;
char* pszData = (*pFun)("计算机");
char* GtCodeUtf8ToGB2312(char* pszUtf8)
{
char* pszGB2312 = NULL;
......
return pszGB2312;
}
再举两个C语言中典型的函数指针的例子:
例一:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);其中第三个参数是一个函数地址,指向被创建线程的核心处理函数。
例二:void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));其中最后一个参数也是一个函数地址,指向两个元素对比计算函数。
关于“事件+代理”设计概念的理解和用法大致是这些,其实无论哪种开发语言共通的是设计思想差异的是语法格式,场景不同适用的开发语言可能不同,每个语言从诞生到发展到消失都是随着计算机技术革命而不断繁衍和进化,C#语言还有许多挺有意思的地方,留在以后慢慢聊吧。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
爬!扒@切#存$构%查
喜欢java主要是喜欢它的简单,一次调用的背后是许多开发者默默的付出,讨厌java主要是讨厌它的简单,一次调用的背后完全不知道系统私下里都干了些啥。计算机技术经历几十年发展,底层的东西日趋完善,后来人在前辈的基础上快速构建,把产品推向市场,反馈迭代再反馈再迭代,变现盈利才是王道。当下有些强业务型互联网企业重融资重逼格,满嘴设计模式数据结构算法大全,闭口不谈运营模式产品形态用户体验~!@#$%^&*()...... 爬是爬虫,网页爬取,爬网页是技术活有难度有挑战,有些站点不喜欢被爬,爬烦了容易被拉黑,有些页面不是静态的,来来回回多步交互才能完成爬取,有些站点需要验证登录,各种形式验证码考验人脑眼手配合更别提机器识别了。 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>fluent-hc</artifactId> <version>4.5.3</version> </dependency> ...
- 下一篇
C#精读研习摘要
C面向过程、golang半对象化、C#、C++和java都是纯纯的面向对象的计算机开发语言,纯到main都静态在类里,纯到没有全局变量的概念,纯到方法不能脱离类独立存在,面向对象的编程思想是计算机发展历史上的一次革命与突破,与面向过程的编程思想相比无所谓孰优孰劣,每种语言都有自己的亮点和槽点,结合几种主流语言聊聊它们和C#的一些逗比差异。 1、判断表达式:在if、while、do ... while、for语句中C认为0为false其他为true,C++为了向下兼容作了隐式转换,C#和java中一定要用布尔表达式,把非零值当做真有时候可能只是一厢情愿。 2、分支语句:C#要求每个分支必须break或者goto,其他语言中那种自动向下遍历分支的功能在C#中被终结,使用中需要特别注意。 3、foreach语言:C完全不支持,C# 用法foreach(类型 变量名 in 表达式),java用法foreach(类型 变量名 : 表达式),go用法for _, v := range x {fmt.Println(v)},C#和java的区别在于in和冒号,go的循环语句最强大,匿名变量自动指向下...
相关文章
文章评论
共有0条评论来说两句吧...