C#中委托的理解

C#中的委托类似于C++中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。

委托包含两部分,委托的声明和委托的实例化。

委托的声明示例如下:

public delegate string printString(string str);

委托的实例有两种方式,一种是通过new的方式创建,另一种方式是通过"+="注册的方式创建。

通过new创建实例的示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp1
{internal class Program{public delegate string printString(string str);public string PrintOK(string str){string newStr = str + " OK";return newStr;}public string PrintError(string str){string newStr = str + " Error";return newStr;}public void printInfo(string str){printString ps1 = new printString(PrintOK);printString ps2 = new printString(PrintError);Console.WriteLine(ps1(str));Console.WriteLine("---------------------");Console.WriteLine(ps2(str));Console.WriteLine("---------------------");}static void Main(string[] args){Program p = new Program();p.printInfo("hello");Console.ReadKey();}}
}

返回值如下:

hello OK
---------------------
hello Error
---------------------

通过"+="注册的方式创建实例的示例

说明:通过+=方式注册的函数都会被执行,但是假如delegate方法有返回值,则只返回最后一次注册的返回值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp1
{internal class Program{public delegate int addNum(int i);public static int num = 0;public int addOne(int i){num += 1;return i + 1;}public int addTwo(int i){num += 2;return i + 2;}public int addNumResult(int i){addNum an = null;an += addOne;an += addTwo;return an(i);}static void Main(string[] args){Program p = new Program();int result = p.addNumResult(10);Console.WriteLine(result);Console.WriteLine(num);Console.ReadKey();}}
}

此时返回:

12(代表只返回最后一个注册函数的值)

3(代表所有的注册函数都执行了一遍)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Manjora 中使用idm,linux通用

说明 在Mnajora中的idm需要在wine中运行,idm是一款很不错的下载工具,但是在linux不能直接使用,借助wine也无法使用浏览器的集成插件,在网上偶然发现一款第三方插件能够在linux的浏览器中将链接捕捉到idm中,虽然使用起…

js 什么是外边距重叠怎么解决

外边距重叠(Margin Collapsing)是指在特定情况下,相邻的块级元素的上下外边距会合并为一个外边距的现象。这种行为可能导致页面布局不符合预期。 外边距重叠通常发生在以下情况下: 相邻兄弟元素:当相邻的两个兄弟元素…

git安装教程 Windows 附安装包链接

Git是一款分布式源代码管理工具(版本控制工具) 。 git的作用 当你需要做一个大工程的时候,文件的管理无疑是非常庞大的工作,因为你需要不断的修改更新文件内容,同时可能还要保留旧版本保证可以复原,这样就需要备份多个版本的文件…

计网期末复习(一)

计网期末复习(一) – WhiteNights Site 标签:计算机网络 诶,期末。诶,复习。 TCP/IP参考模型的网络层提供的是? 区别于传输层,网络层提供不可靠无连接的数据报服务 当时看到TCP/IP就选了可靠有…

RT-Thread学习(一)简介及基础环境配置

系列文章目录 文章目录 系列文章目录前言简要介绍配置环境修改工作时钟更改ROM空间添加FinSH串口命令提示 前言 之前学习了FreeRTOS,但是一直想深入学习,但是没有人指导,又不知道该如何学习,于是再学习一个操作系统看看情况。 简…

QEMU源码全解析 —— PCI设备模拟(10)

接前一篇文章: 上一回讲到,在SeaBIOS的调用链dopost->maininit->platform_hardware_setup->qemu_platform_setup->pci_setup->pci_bios_map_devices过程中,最后这个函数负责完成PCI设备BAR的设置。 其中包括I/O、MEM以及PREF…

Docker安装Odoo17

Docker安装Odoo 前言所需环境安装步骤登录Odoo 配置数据库 前言 Odoo是一个开源的ERP框架,它提供了一套完整的、可定制的、模块化的企业管理软件解决方案。以下是Odoo的主要特点: 模块化设计:Odoo的各个功能都以模块的形式提供,包…

linux主机的免密登录

实现linux主机之间的相互免密登录 在进行远程登录的时,服务器和主机间进行认证阶段分为: 基于口令认证(不安全,易被抓包拦截获取) 客户机连接服务器时,服务器将自己的公钥返回给客户机 客户机会将服务器的…

Vue中避免滥用this去读取data中数据

template模板中如何避免 提前处理v-for循环所用的数据,不要在v-for循环中去读取数组、对象类型的数据。在上述template模板中滥用this的例子中可以这样优化。 假设list、arr、obj皆是服务端返回来的数据,且arr和obj没有用到任何模块渲染中,…

机器视觉系统选型-参数—景深

镜头在垂直方向上,能清晰成像的空间距离(清晰成像范围),称为景深

【java八股文】之分布式系列篇

1、什么是CAP BASE理论 1.1 CAP 一致性: 在分布式环境下,一致性是指数据在多个副本之间是否能够保持一致性的特性,等同于所有的节点访问同一份最新数据的副本。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该…

CSAPP - 反编译 initialize_bomb()

CSAPP - 保持好奇,反汇编 initialize_bomb() 相比于直接看 bomblab phase_1 的答案,我更想搞懂答案之外涉及的每个函数的反汇编 - 反正是一个实验,代码能复杂到哪里去? 而搞懂这些函数, 无疑对于实际工程中的各种 deb…

nrm使用

为了更方便的切换下包的镜像源,我们可以安装 nrm 这个小工具,利用 nrm 提供的终端命令,可以快速查看和切换下 包的镜像源。 //通过 npm 包管理器,将 nrm 安装为全局可用的工具 npm i nrm -g//查看所有可用的镜像源 nrm ls//将下载…

【现代密码学】笔记 补充7-- CCA安全与认证加密《introduction to modern cryphtography》

【现代密码学】笔记7-- CCA安全与认证加密《introduction to modern cryphtography》 写在最前面7 CCA安全与认证加密 写在最前面 主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》…

mysql数据库被黑恢复—应用层面delete删除---惜分飞

客户的mysql被人从应用层面攻击,并且删除了一些数据,导致业务无法正常使用,通过底层分析binlog确认类似恢复操作 确认这类的业务破坏是通过delete操作实现的,客户那边不太幸,客户找了多人进行恢复,现场严重破坏,老库被删除,并且还原了历史的备份文件(非故障第一现场),通过底层…

Error: error:0308010C:digital envelope routines::unsupported的解决方案

因为最近安装了pnpm对node版本有要求,升级了node版本是18以后,在运行之前的项目,就跑不起来了,报错如下: Error: error:0308010C:digital envelope routines::unsupported解决方案一: node版本切换到16版…

KEI5许可证没到期,编译却出现Error: C9555E: Failed to check out a license.问题解决

一、编译出现如下报错 二、检查一下许可证 三、许可证在许可日期内,故应该不是许可证的问题 四、检查一下编译器,我用的是这个,这几个编译器的区别其实我不太明白,但我把问题解决是选的这个 五、找到编译器的路径,去复…

Dockerfile的COPY --link

文章目录 总结环境概述“ --link” 是什么引入“ --link”使用“COPY --link”示例什么情况不适用总结参考 注:我做了很多测试,发现不管是否使用 --link ,结果貌似都一样。我在网上搜了半天,最后发现,该功能貌似目前被…

计算机网络的常用的网络通信命令(Windows)

ping:它是用来检查网络是否通畅或者网络连接速度的命令。ping命令利用的原理是:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目…

父(子)组件获取子(父)组件的方法和数据

1.父组件获取子组件的方法和数据 在父组件中的子组件添加 ref"childName"&#xff0c;childName自定义 <childComponent ref"childName"></childComponent> #获取子组件的方法 method:方法名this.$refs.childName.method()#获取子组件的数…