C#中的delegate和event,及他们的区别

简述:

delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。委托也成就之后的匿名函数和Lambda表达式。

event就是由某个对象发出的消息,这个消息标志着某个特定的行为发生了,或者某个特定的条件成立了。比如用户点击了鼠标、socket上有数据到达等。那个触发(raise)事件的对象称为事件的发送者(event sender),捕获并响应事件的对象称为事件的接收者(event receiver)。C#中事件的实现依赖于delegate,C#中的事件处理实际上是一种具有特殊签名的delegate,是一种封装过的delegate

事件和委托的区别

1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用

2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。
    
    delegate的使用案例

class Program
    {
        static void Main(string[] args)
        {
            testExampleexample = new Example();
            example.Gorun();
            Console.ReadKey();
        }
    }
    public class testExample
    {
        public delegate void FunSth(string str);
        internal void Gorun()
        {
            //声明一个委托变量,并把已知方法作为其构造函数的参数
            FunSth = new FunSth(Print);
            string str = "Hello,World";
            //通过委托的静态方法Invoke触发委托
            d.Invoke(str);
        }
        void Print(string str)
        {
            Console.WriteLine(str);
        }
    }

上面使用详解:

1、 在CLR运行时,委托FunSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。
2、委托FunSth定义了方法的参数和返回类型
3 、通过委托FunSth的构造函数,可以把符合定义的方法赋值给委托
4 、调用委托的实例方法Invoke执行了方法
event的使用案例

public class TestExample
{
    public delegate void FunSth(object sender, EventArgs e);
    public event FunSth myDoRunSth;
    internal void Go()
     {
            //声明一个委托变量,并把已知方法作为其构造函数的参数
            FunSth d = new FunSth(Print);
            object sender = 10;
            EventArgs e = new EventArgs();
            myDoRunSth += new FunSth(d);
            myDoRunSth(sender, e);
     }
     void Print(object sender, EventArgs e)
     {
          Console.WriteLine(sender);
     }
    }
}

上面的使用详解

1 声明了事件FunSth,事件的类型是FunSth这个委托

2 通过+=为事件注册委托

3 通过FunSth委托的构造函数为事件注册委托实例

4 采用委托变量(参数列表)这种形式,让事件执行方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/575277.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang特殊init函数

介绍 init()函数是一个特殊的函数&#xff0c;存在一下特性 不能被其它函数调用&#xff0c;而是子main()函数之前自动调用不能作为参数传入不能有传入参数和返回值 作用&#xff1a; 对变量进行初始化检查/修复程序状态注册运行一次计算 以下是<<the way to go>>…

(开源版)企业AI名片S2B2C商城系统商业计划书

团队使命 擎动人工智能跃迁&#xff0c;融技术与商业之行 项目背景 话说2022年12月7日那天&#xff0c;国务院大大发布了个重磅消息&#xff0c;宣布咱们国家的三年抗疫大战终于告一段落&#xff0c;全面放开啦&#xff01;这意味着咱们的市场经济要重新焕发生机啦&#xff…

【EI会议|稳定检索】2024年航空航天、空气动力学与自动化工程国际会议(ICAAAE 2024)

2024 International Conference on Aerospace, Aerodynamics, and Automation Engineering 一、大会信息 会议名称&#xff1a;2024年航空航天、空气动力学与自动化工程国际会议 会议简称&#xff1a;ICAAAE 2024 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Schol…

短袖面料有哪些种类?质量好的短袖品牌实测推荐

夏天确实是一个让人感到炎热的季节&#xff0c;而选择合适的短袖对于提高穿着的舒适度和避免不必要的困扰非常重要。所以为了让大家能够选到一些合适自己而且质量好短袖&#xff0c;今天为大家总结了几点关键的选购技巧或一些知识科普&#xff01;并且结合我近期测评过的众多短…

【C++ STL序列容器】list 双向链表

文章目录 【 1. 基本原理 】【 2. list 的创建 】2.1 创建1个空的 list2.2 创建一个包含 n 个元素的 list&#xff08;默认值&#xff09;2.3 创建一个包含 n 个元素的 list&#xff08;赋初值&#xff09;2.4 通过1个 list 初始化另一个 list2.5 拷贝其他类型容器的指定元素创…

Qt : 在QTreeWidget中添加自定义右键菜单

一、引言 如图&#xff0c;我们需要在一个QTreeWidget 控件中添加了自定义右键菜单。 二、思路 如何做到的呢&#xff0c;很简单。浅浅记录和分享一下。 继承QTreeWidget&#xff0c;定义一个子类CustomTreeWidget &#xff0c;在重写contextMenuEvent 事件即可。 三、代…

【MySQL】InnoDB与MyISAM存储引擎的区别与选择

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。 存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可被称为表类型。我们可以在创建表的时候&#xff0c;来指定选择的存储引擎&#xff0c;如果没有指定将自动选择默认的存储引擎。…

深浅拷贝及其现代写法

#include<iostream> using namespace std; class Person { public://默认构造Person(){cout << "Person()" << endl;}//有参构造函数Person(int age,int height){m_age age;m_height new int(height);cout << "Person(int age, int h…

centos7搭建maven私服nexus

1.nexus Nexus Repository Manager&#xff08;通常简称 Nexus 或 Nexus RM&#xff09;是由Sonatype公司开发的一款开源的、强大的软件仓库管理工具&#xff0c;主要用于企业级的二进制组件&#xff08;如Java库、Node.js模块、Python包等&#xff09;存储、管理和分发。 官方…

DRF学习之三大认证

一、认证 1、自定义认证 在前面说的 APIView 中封装了三大认证&#xff0c;分别为认证、权限、频率。认证即登录认证&#xff0c;权限表示该用户是否有权限访问接口&#xff0c;频率表示用户指定时间内能访问接口的次数。整个请求最开始的也是认证。 &#xff08;1&#xff…

Unity射击游戏开发教程:(3)如何销毁游戏对象 ,添加CD

在 Unity 中销毁游戏对象 在我之前的文章中,我写了关于实例化或创建激光预制体,当发射时,激光预制件将继续在屏幕上移动一段时间。 创建所有这些激光预制件后,最终会减慢游戏速度,因此我们必须通过创建激光预制件来找到平衡,在屏幕上移动直到它超出游戏视图,然后销毁它…

【RAG 论文】Adaptive-RAG:自适应地根据 query 难度来选择合适的 RAG 模型

论文&#xff1a;Adaptive-RAG: Learning to Adapt Retrieval-Augmented Large Language Models through Question Complexity ⭐⭐⭐⭐ Code&#xff1a;github.com/starsuzi/Adaptive-RAG NAACL 2024&#xff0c;arXiv:2403.14403 文章目录 一、论文速读二、实现细节2.1 三种…

GitHub/R3D3项目环境配置踩坑记录

1、前言 项目链接地址&#xff1a;SysCV/r3d3 (github.com) 按照安装步骤容易出现的问题&#xff0c;environment.yaml文件中安装相关包&#xff0c;其中还有两个pip install githttps://github.com/..........这两个建议注释掉&#xff0c;后面再来安装这两个。 2、问题及解…

下载六佰之际暨 SDK+Plugin 升级

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 这几个版…

Qt图片等资源管理

Qt的图片等资源管理通常有两种方式 1&#xff0c;直接将图标和一些配置文件打包在可执行程序中 添加qrc文件&#xff0c;可使用qtcreator直接添加 右键选中工程 点击选择即可。 然后添加文件。我这个例子是添加了Image文件夹下的图片资源 使用的时候&#xff0c;可以在代码…

Oracle Analytics BIEE 操作方法(六)数据格式1:百分比

问题&#xff1a; 有如下公式&#xff0c;将数据显示为按行的百分比。此时数据显示只会有一位小数。想显示两位 解决方案 在分析中找到“高级”标签&#xff0c;将“分析XML”中内容复制出来 替换 将&#xff1a;minDigits“1” maxDigits“1” 替换为&#xff1a;minDigits…

在线HTML编辑器源码

在线HTML编辑器源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 index.html <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>在线HTML编辑器</title><meta name"viewport" content"…

10年交易Anzo Capital昂首资本才发现的适合孕线的止损

拥有10年交易经验的投资者才发现的一种止损方法&#xff0c;那就是Inside-bar孕线止损&#xff0c;有些投资者就有疑问了&#xff0c;止损能明白&#xff0c;但是什么是Inside-bar孕线?其实很简单&#xff0c;Anzo Capital昂首资本就先做个知识普及&#xff1a; inside-bar就…

一文读懂VR数字展览会,从沉浸式体验到市场竞争力的全方位提升

在数字化转型的浪潮中&#xff0c;VR技术正逐渐成为商业展览的新趋势。VR数字展览会通过创新的展示功能和互动体验&#xff0c;为参展商和观众带来前所未有的便利和效果。 一、VR展示功能的沉浸式体验 1、全方位沉浸式体验&#xff1a; VR技术能够创造一个全方位的三维展览环…

备考2024年上海初中生古诗文大会:单选题真题示例和独家解析

上海市中小学生的初中生古诗文大会——即上海中学生古诗文大会&#xff08;初中组&#xff09;和小学生古诗文大会&#xff08;比赛&#xff09;相比&#xff0c;除了题型更丰富之外&#xff0c;最主要的是考察的内容深度和广度不同。初中的题目中对于文言文的考察大幅增加&…