C#事件实例详解

发布时间 - 2026-01-11 02:00:30    点击率:

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#事件  # C#事件详解  # 绑定  # 创建一个  # 更强大  # 的人  # 返回值  # 都是  # 运算符  # 后端  # 是一个  # 设计思想  # 让人  # 你追我赶  # 拥趸  # 两种  # 是从  # 而不  # 有许多  # 可以通过  # 用了  # 希望能 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  如何快速搭建高效简练网站?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  详解vue.js组件化开发实践  Mybatis 中的insertOrUpdate操作  高端企业智能建站程序:SEO优化与响应式模板定制开发  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Bootstrap整体框架之CSS12栅格系统  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  javascript中的try catch异常捕获机制用法分析  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  活动邀请函制作网站有哪些,活动邀请函文案?  如何在阿里云购买域名并搭建网站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  jQuery中的100个技巧汇总  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  高端云建站费用究竟需要多少预算?  高端建站三要素:定制模板、企业官网与响应式设计优化  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  韩国服务器如何优化跨境访问实现高效连接?  网站建设保证美观性,需要考虑的几点问题!  如何选择可靠的免备案建站服务器?  浅谈Javascript中的Label语句  历史网站制作软件,华为如何找回被删除的网站?  如何在云主机上快速搭建网站?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  html如何与html链接_实现多个HTML页面互相链接【互相】  海南网站制作公司有哪些,海口网是哪家的?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  如何用AWS免费套餐快速搭建高效网站?  实例解析angularjs的filter过滤器  如何自定义建站之星网站的导航菜单样式?  郑州企业网站制作公司,郑州招聘网站有哪些?  JS去除重复并统计数量的实现方法  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在IIS中新建站点并解决端口绑定冲突?  b2c电商网站制作流程,b2c水平综合的电商平台?  Linux网络带宽限制_tc配置实践解析【教程】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  javascript基于原型链的继承及call和apply函数用法分析  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制