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 *));其中最后一个参数也是一个函数地址,指向两个元素对比计算函数。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍wxPython事件驱动实例详解,包括了wxPython事件驱动实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了wxPython的事件驱动机制,分享给大家供大家参考。具体方法如下: 先来看看如下代码: 程序运行效果如下图所示: wxStaticText的两个构造函数官方文档如下: wxStaticText () Default constructor. wxSt
本文向大家介绍详解C#之事件,包括了详解C#之事件的使用技巧和注意事项,需要的朋友参考一下 事件:定义了事件成员的类允许通知其他其他对象发生了特定的事情。具体的说,定义了事件成员的类能提供以下功能 1.方法能登记它对事件的关注 2.方法能注销它对事件的关注 3.事件发生时,登记了的方法将收到通知 类型之所以能提供事件通知功能,是因为类型维护了一个已登记方法的列表。事件发生后,类型将通知列表中所有已
本文向大家介绍javascript事件监听与事件委托实例详解,包括了javascript事件监听与事件委托实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript事件监听与事件委托。分享给大家供大家参考,具体如下: 事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听。但是当页面中存在大量需要绑定事件的元素时,这种方式
本文向大家介绍C# WPF ListView控件的实例详解,包括了C# WPF ListView控件的实例详解的使用技巧和注意事项,需要的朋友参考一下 C# WPF ListView控件的实例详解 C#的WPF作为现在微软主流的桌面程序开发平台,相比过去的MFC时代,有了非常多的不同。本人刚从MFC平台转过来,以为可以轻松上手,哪知碰到了很多问题,十分不解。不得不乖乖回去看了本书,再继续回到边左边
本文向大家介绍Java事件处理机制(自定义事件)实例详解,包括了Java事件处理机制(自定义事件)实例详解的使用技巧和注意事项,需要的朋友参考一下 Java事件处理机制 java中的事件机制的参与者有3种角色: 1.event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中 2.event source:具体的事件源,比如说,你点
本文向大家介绍js事件监听器用法实例详解,包括了js事件监听器用法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js事件监听器用法。分享给大家供大家参考。具体分析如下: 1、当同一个对象使用.onclick的写法触发多个方法的时候,后一个方法会把前一个方法覆盖掉,也就是说,在对象的onclick事件发生时,只会执行最后绑定的方法。而用事件监听则不会有覆盖的现象,每个绑定的事件都会