一 、使用位置不同

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

二、使用符号不同

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

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

打个比方,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. c++ 预处理 编译 链接 文件组织形式

    -- 整体流程 C++ 源文件 (.cpp) ↓ 预处理(展开头文件.宏替换等) 预处理后的代码 (.i) ↓ 编译(编译器) 汇编代码 (.s) ↓ 汇编(汇编器) 目标文件 (.o / .obj) ...

  2. 开源项目丨一文详解一站式大数据平台运维管家ChengYing如何部署Hadoop集群

    课件获取:关注公众号"数栈研习社",后台私信 "ChengYing" 获得直播课件 视频回放:点击这里 ChengYing开源项目地址:github 丨 git ...

  3. [CF1508D] Swap Pass

    D - Swap Pass 先将所有\(a_i==i\)的点都直接去掉 考虑将\(i\)向\(a_i\)连边,那么就会形成一个个的环 考虑只有一个环的情况,那么我们任意固定一个点\(x\),一直交换\ ...

  4. stm32达到什么程度叫精通?

    作为一个在嵌入式领域摸爬滚打了快10年的老兵,看到这个问题时我陷入了深深的思考.精通?这两个字说起来轻松,但要真正做到却是另一回事.我记得刚入行的时候,觉得会用几个库函数就算"精通" ...

  5. Win11 23H2 升级到 24H2 后,VB程序出错的一个解决方法:重新修复Office。

    单位VB小程序用着一直正常,它是从EXCEL中读取数据,写入ERP里.某天同事操作系统由Win11 23H2升级到 24H2后,小程序运行就死机,但如果是全新安装的24H2版本就没问题. 一开始以为是 ...

  6. Python库积累之Selenium(一)-Seleniun基础

    Selenium是一个用电脑模拟人操作浏览器网页,支持多平台,多浏览器和多种编程语言,广泛应用于自动化,测试,爬虫等场景中. 官方文档:https://www.selenium.dev/seleniu ...

  7. C++ 11 move

    简介 简单来说, move 可以对于赋值操作带来更好的效率, 因为减少了临时变量的构建. 另外对于完美转发, 右值与左值的使用, 晕晕晕. 参考链接 https://blog.csdn.net/boo ...

  8. IPC通信

    参考 linux 网络编程第二版 敲 发现 出错了... ... 网上也没有特别多的参考程序.后来在 man msgrcv 里面找到了参考程序 #include <stdio.h> #in ...

  9. 【Container App】创建Container App后发现Application URL不完整

    问题描述 新创建了一个Container App服务,构建在内部访问的环境中( Container App Environment配置了虚拟网络并设置为内部访问). ##Container Apps ...

  10. SciTech-EECS-Manufacturing-Battery:电池 电动车🛵/🚗的功率、行驶里程、电池、BMS、电机 和 控制器

    SciTech-EECS-Manufacturing-Battery:电池 电动车/的功率.行驶里程.电池.BMS.电机 和 控制器: 消费者去买电动车,店家广告上 "车能跑100公里不充电 ...