一 、使用位置不同

事件只能在本类型内部“触发”,委托不管在本类型内部还是外部都可以“调用”。

二、使用符号不同

在类的外部,事件只能用“+=”和“-=”去订阅/取消订阅,如果是委托的话还可以使用“=”。

委托的本质,是一个,而事件,是委托这个类的一个私有变量加上两个公有方法(事件的+=和-=这两个公有方法,和委托实例的+=和-=功能上非常像,但并不是同一个东西),这是本质区别。

打个比方,string 也是一个类,而string s = "a",这个s是string这个类的一个变量(略有不恰当,为了方便直观理解,那么,委托是和string这个类同等的地位,而事件,是和s这个变量同等的地位)。

public delegate void myDel();相当于你创建了一个myDel的类,所以委托可以在任何地方创建,类需要实例化,所以委托需要实例化,要myDel m = ……;

申明一个事件 public event myDel myEvent;

事件myEvent类似于是一个myDel类型的一个变量,因为是变量,所以事件只能在类里面申明,不需要实例化,有点类似于上面的那个m。

既然myEvent(类似)和变量m都是myDel类型的一个变量,为什么还要弄一个事件这种东西出来,变量m不就可以实现事件的需求(监听,广播)吗?这里牵涉到了面向对象的一些设计理念,事件可以理解为委托实例m的一个约束版。

第一:委托实例m,哪里都可以用“+=”,“-=”,“=”三种方式,事件myEvent也可以用“+=”,“-=”,“=”三种方式,但是,事件的“=”必须要在申明他的类里面,才能用,外部,不能用,外部只需要关注注册“+=”和注销“-=”即可。因为外部如果可以用“=”,就会覆盖原有的其他注册进来的方法,这表明不安全,违背了封装性,外部的监听者,你只能管好自己是否监听,而不能因为你的监听误操作(“=”),覆盖了其他的未知监听者,所以在外部事件不允许用“=”。

第二:委托实例m,可以在任何地方调用,而事件myEvent,只能在申明他的类里面调用。这种限制,也是从面向对象的理念考虑。假设某个类(Class A)里面有一个事件,当这个类(Class A)的里面的某某属性(int b)发生了变化,然后发出通知,告诉所有的监听者。那么这个属性b,变没变,什么时候变,只能由A这个类自己知道,自己决定,自己触发,外部的任何类,无权过问,而委托的实例可以在任何地方调用,不符合这种封装性。

事件就是把委托实例的所有权利,都留给申明他的类,而只开放委托实例的注册和注销功能,给外部类。

事件最常用的场景,是用于广播变化给监听者,委托最常用的场景,是用于将方法当做参数进行传递(当然,委托也可以达到和事件一样的广播效果,不过没有事件那么安全)

C#里事件和委托有什么区别啊的更多相关文章

  1. C#事件与委托的区别

    C#事件与委托的区别 1. 委托 事件是利用委托来定义的,因此先解释委托.委托是一个类,它与其他类如int,string等没有本质区别,int代表的是所有的整形,而string代表的是字符串,委托则代 ...

  2. C#事件与委托详解【精华 多看看】

    Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与 ...

  3. C#基础知识之事件和委托

    本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.委托的调用方式.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码 ...

  4. 解密jQuery事件核心 - 委托设计(二)

    第一篇 http://www.cnblogs.com/aaronjs/p/3444874.html 从上章就能得出几个信息: 事件信息都存储在数据缓存中 对于没有特殊事件特有监听方法和普通事件都用ad ...

  5. c#事件与委托

    C#.net 目录(?)[-] 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托事件与Observer设计模式 范例说明 Observer设计模式简介 实现范例的Obse ...

  6. C# 事件和委托

    相信大家在面试的时候会经常问到事件和委托的区别,为什么.net中需要事件和委托这样类似的问题吧,对于一些初学者来说可平时用的过程中也不知道为什么, 只知道这样用,而对于其中的实现机制不是很清楚, 所以 ...

  7. 《C#高级编程》学习笔记------C#中的事件和委托

    本文转载自张子阳 目录 委托的作用 将方法绑定到委托 事件的来由 Observer设计模式 .Net Framework中的委托与事件   引言 委托 和 事件在 .Net Framework中的应用 ...

  8. 事件、委托、委托方法的总结(使用EventHandler<>)

    在C#中,定义事件.委托.委托方法可以使用类库内的EventHandler泛型委托来定义事件.并根据该泛型委托定义实现方法: 同样您也可以自定义委托 来定义事件以及 根据自定义的委托来定义实现事件的方 ...

  9. C#基础精华07(委托事件,委托的使用,匿名方法)

    1.委托概述 委托是一种数据类型,像类一样(可以声明委托类型变量).方法参数可以是int.string.类类型 void M1(int n){  } √ void M2(string s){  } √ ...

  10. [C#参考]事件和委托的关系

    前面说了委托,接下来就要说一说事件了,同时最后再说一下委托和事件的区别. 事件和委托很相似,事件就好像是被简化的针对特殊用途的委托.看下面的图: 从这张图中能看到,事件是发布者的一个成员,它不是类型. ...

随机推荐

  1. SenseVoice部署,并调用api接口

    目录 安装Python 代码下载 虚拟环境 安装依赖 下载模型 修改启用webui.py 启用api.py 安装Python 这个网上找下教程安装下就可以,版本应该没有什么要求,我装的是3.10.7 ...

  2. Web前端入门第 68 问:JavaScript 事件循环机制中的微任务与宏任务

    JS 是单线程语言.这句话对不对? 按照目前的情况来看,JS 自从支持了 Web Worker 之后,就不再是单线程语言了,但 Worker 的工作线程与主线程有区别,在 Worker 的工作线程中无 ...

  3. 在Ubuntu上使用Certbot申请Let’s Encrypt SSL证书

    1 引言 要使用HTTPS就必须得有SSL证书.理论上,证书是可以通过像OpenSSL这样得工具生成的.不过这种证书只能自己测试用,浏览器上面是不认的,会提示用户不安全.也就是说,浏览器只接受一些特定 ...

  4. 基于 swoole 下 异步队列和毫秒定时任务 API

    说明 1.在 Server 程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web 服务器中发送邮件.如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢. Swoole 提供了异步 ...

  5. Macbook装Window后触摸滑动方向反

    找到设备id 可以看到我的是: VID_05ac&PID_0276&MI_02&Col01\6&8d58d53&0&0000 如果有多个,可以在常规&g ...

  6. ble python 成功的例子 创建GATT服务 BLUEZ 5.47

    发现是偶然事件,正确的做法可能要修改bluez里面服务的注册方式,把ble的服务发现注册到sdp.具体做法不清楚.但是肯定要修改源码. 工欲善其事,必先利其器 使用未知的工具,现在一个良好的平台上走通 ...

  7. iPaaS混合集成平台,打造数字化生态

    如今企业分工越来越细,上下游合作越来越紧密.各企业之间的业务系统需要相互协作完成业务.外部API依赖越来越多.同时企业系统运行在多个混合云环境及SaaS中,私有端大量业务系统与云端系统形成了错综复杂的 ...

  8. 多模态“卷王”阶跃星辰:如何利用 JuiceFS 打造高效经济的大模型存储平台

    在业界有"多模态卷王"之称的阶跃星辰,自研的 22 款基础模型中有 16 款为多模态模型,覆盖文字.语音.图像.视频.音乐与推理等多个方向.为支撑多模态模型的研发与落地,团队在基础 ...

  9. 【转】-Java CAS 原理剖析

    Java CAS 原理剖析 本文转载来自​卡巴拉的树​的​Java CAS 原理剖析 在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁 ...

  10. 没有Happens-Before?你的多线程代码就是‘一锅粥’!

    内存模型与happens-before:开发者与硬件的和平条约 在前文中,提到处理器通过一些特殊指令(如 LOCK.CMPXCHG.内存屏障等)来保障多线程环境下程序的正确性.然而,这种做法仍然存在几 ...