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

标签:C#,事件
0
投稿

猜你喜欢

  • 基于Elasticsearch5.4的常见问题总结

    2022-07-15 15:02:49
  • springboot添加https服务器的方法

    2022-08-19 06:14:31
  • Springboot actuator生产就绪功能实现解析

    2021-07-23 12:57:06
  • 详解java动态代理模式

    2023-03-29 13:39:29
  • Android 8.0升级不跳转应用安装页面的解决方法

    2022-03-20 03:30:13
  • 一文详解Spring的Enablexxx注解使用实例

    2023-09-03 08:43:18
  • Android自定义View之组合控件实现类似电商app顶部栏

    2023-07-26 22:14:10
  • Android自定义View实现遥控器按钮

    2021-12-27 09:50:47
  • springboot整合mybatis将sql打印到日志的实例详解

    2022-06-15 00:56:06
  • Java实现邮件找回密码功能

    2022-08-18 07:12:57
  • springboot返回图片流的实现示例

    2023-11-23 17:30:08
  • MyBatis的逆向工程详解

    2022-12-03 11:06:10
  • mybatis-plus 返回部分字段的解决方式

    2023-03-25 14:45:04
  • C#应用BindingSource实现数据同步的方法

    2021-07-09 16:15:48
  • 完美解决单例设计模式中懒汉式线程安全的问题

    2021-12-30 01:54:21
  • C sharp (#) 数据类型获取方式

    2022-03-29 00:33:10
  • Java 数组元素倒序的三种方式(小结)

    2022-04-01 22:59:19
  • Android AutoCompleteTextView控件使用实例

    2023-11-24 03:01:56
  • Java使用HttpClient实现Post请求实例

    2022-05-22 08:37:43
  • java.lang.Void类源码解析

    2022-07-15 04:07:46
  • asp之家 软件编程 m.aspxhome.com