C#事件实例详解
作者:lqh 发布时间:2022-04-23 22:24:47
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 *));其中最后一个参数也是一个函数地址,指向两个元素对比计算函数。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:https://my.oschina.net/u/1376494/blog/911649
猜你喜欢
- 日志是非常重要的,虽然他不会以需求功能提来,但也不会体现在产品方案中。但是,它在系统项目中却占有巨大的地位。为了保证服务的高可用,发现问题一
- 前言众所周知在spring boot内,设置session过期时间只需在application.properties内添加server.se
- 在开发过程中.数组和集合的处理是最让我们担心.一般会用for or foreach 来处理一些操作.这里介绍一些常用的集合跟数组的操作函数.
- 本文实例为大家分享了Java Socket聊天室功能的具体代码,供大家参考,具体内容如下Client.javaimport java.io.
- 使用例子如下,用JAVA 运行Sort1, 输入你要排序的文件路径 , 如 例子是对H:\下的文件和它所有子文件夹下的文件进行排序2, 输入
- 前言相信小伙伴一定用过 @Transaction 注解,那 @Transaction 背后的秘密又知道多少呢?Spring 是如何开启事务的
- 加载本地图片在项目目录下创建assets文件夹,再在其文件夹下创建images文件夹,后面将需要的图片复制到其中即可在pubspec.yam
- 本文通过JavaMailSender实现邮箱注册验证中遇到的问题开始着手,给大家详细分析了其原理以及问题的解决办法。使用邮箱注册验证,我们需
- Java Benchmark 基准测试的实例详解import java.util.Arrays; import java.util.conc
- 先看下效果:两种需求场景:1.广告页3s后跳转到首页2.短信验证码60s倒计时第一种的话,根据需求我们可以知道,我们想要的效果就是3s结束做
- 1.java创建自定义类数组方法:Student []stu = new Student[3];for(int i = 0; i <
- 一.为什么要用线程池先来看个简单的例子1.直接new Thread的情况:public static void main(String[]
- 这篇文章主要介绍了springboot如何使用AOP做访问请求日志,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 其实以前我对Java的Struts框架没有具体认识,通过这篇文章,真的让我了解了框架的用处,好处。下拉框在Web开发中经常会使用到,下面我们
- JDK8已发布,写了一个datetime时间函数使用方法的小示例package datetime;import static java.ti
- 一、背景Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和
- Lombok有什么用在我们实体Bean中有大量的Getter/Setter方法以及toString, hashCode等可能不会用到,但是某
- 概述对List进行分组是日常开发中,经常遇到的,在JDK 8中对List按照某个属性分组的代码,超级简单。package test;impo
- 前言Vector是java.util包中的一个类。 SynchronizedList是java.util.Collections中的一个静态
- [LeetCode] 9. Palindrome Number 验证回文数字Determine whether an integer is