如题: C# func and action委托是什么?

1) 回答这个问题之前,我们需要了解什么是委托(英文 Delegate )?

为了便于理解,再往前推一步,回到c语言时代,指针的概念。

什么是指针,其实就是内存地址。

那什么是内存地址?就要先说说内存条了,通常情况下我们在网上买的内存条比如8G,16G,

这个是硬件设备。

那内存条8G和16G的含义是什么?

就涉及内存的另外两个概念:

1.内存的寻址能力。

即每个内存单位能存多少位(bit),

每一个bit,其实就是存放0或者1。 内存寻址能力通常是8位,单位是字节,8bit=1byte。

2.内存的地址范围,专业点叫寻址空间。

8G内存条能存放的数据量:

1(Byte)210(KB)*210(MB)2^10(GB) ---> 1GB ---> 2^30次方

8GB --->23*230 ---> 2^33 次方

我们知道内存的存储容量和内存的地址范围后,那c语言中,指针即是内存的地址了。

计算机中程序运行的数据通常放在内存中,不同类型的数据占用的内存大小是不一样的,

比如 int 占用4个字节(4个内存单位,32位),所以int的取值范围是 -2^31 到 2^31-1

怎么算的?

32位中,其中1位用来表示符号,剩下31位可以用来存放数字,

所以负数范围是 -2^31

正数和0 是2^31, 所以扣减一个0, 正数范围是2^31-1

我们知道int 占用4个字节(4个内存单位)后,程序如何获取这个数字,就需要知道起始的第一个内存单位地址,即变量地址或者指针。

c语言中,不管是变量还是函数,运行时都要加载到内存中。 数据和代码都以二进制的形式存储在内存中,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。

特别注意 CPU 访问内存时需要的永远是地址,而不是变量名和函数名。变量名和函数名只是地址的一种助记符,方便人而已。 当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。

接下来说说函数指针:

在c语言中,一个函数总是占用一段连续的内存区域,函数名在被编译和链接后会被转换为该函数所在内存区域的首地址。我们把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。

说这么多,一句话总结就是函数指针是函数在内存的起始地址,有个这个指针,就可以执行这个函数了。

有个函数指针的铺垫,接下来看看我们的主题:委托(Delegate)。

A delegate is a reference to a method. We can use a delegate object to pass it to the code in which we want to call a referenced method, without knowing at compile time which method will be invoked.

在c#中,委托类似于c语言的函数指针概念。

2)c#中委托如何定义? 来段程序员的经典口头禅(Talk is cheap, Show me the code)

通过使用delegate关键字声明,然后定义函数(方法)的签名,使用的时候,传入你要代理的方法名,然后通过此委托名调用你的真正函数(方法), 方法的签名务必和委托定义的一致。

此例子中,同一个委托,分别指向了两个方法的引用。

3)在c#中内置了两个重要的委托 Func和 Action

Func 此委托可代理或者封装一个最多可达16个输入参数且带返回值的方法,其中最后一个参数是返回值。

Func<Type1, Type2..., ReturnType> DelegateName = new Func<Type1, Type2..., ReturnType>(MethodName);

比如: int GetAge(string name); int GetAge(string name, string school);

string GetName(string name); 等等

老规矩上代码:

Action 此委托可代理或者封装一个最多可达16个输入参数且无返回值的方法。

比如:void HelloWorld(string name); void HelloWorld(string name,strng city);

void HelloWorld(string name, int age);

总结一下:

在介绍C# func和action之前,我介绍了什么是委托,什么是指针,什么是函数指针,

指针和内存的关系, 内存的存储特点,数据和函数在内存的形式,最后是方法签名 ,c#的func和action。

最后看一下.net core WebHostBuilder 的源码

转载请注明出处,谢谢!

回炉重造系列-C# func and action委托是什么?的更多相关文章

  1. Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置

    Asp.Net SignalR 使用记录   工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...

  2. 《回炉重造 Java 基础》——集合(容器)

    整体框架 绿色代表接口/抽象类:蓝色代表类. 主要由两大接口组成,一个是「Collection」接口,另一个是「Map」接口. 前言 以前刚开始学习「集合」的时候,由于没有好好预习,也没有学好基础知识 ...

  3. Func 和 Action 委托

    有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action.如下所示(下面的in表示参数,out表示返回结果): delegate TResult ...

  4. func 和action 委托的使用

    func 可以带返回值,action  不带返回值 平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委 ...

  5. Func和Action委托简单用法

    Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托.在整个.NET框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...

  6. 回炉重造之重读Windows核心编程-006-线程

    线程也是有两部分组成的: 线程的内核对象,操作系统用来管理线程和统计线程信息的地方. 线程堆栈,用于维护现场在执行代码的时候用到的所有函数参数和局部变量. 进程是线程的容器,如果进程中有一个以上的线程 ...

  7. Vue回炉重造之封装一个实用的人脸识别组件

    前言 人脸识别技术现在越来越火,那么我们今天教大家实现一个人脸识别组件. 资源 element UI Vue.js tracking-min.js face-min.js 源码 由于我们的电脑有的有摄 ...

  8. 回炉重造之重读Windows核心编程-003-内核对象

    内核对象是个比较难理解的概念,问题的根源就在于即使是<核心编程>书中也没有说清楚它的定义,只是不停地举例和描述它的性质,还有如何使用. 盲人摸象,难见全貌.只能尽可能列举它的性质,注意使用 ...

  9. 回炉重造之重读Windows核心编程-002-字符集

    使用Unicode的优势: 便于在不同语言之间进行数据交换. 让你的exe或者dll文件支持所有的语言. 提高应用程序的执行效率. Windows2000是使用Unicode重新开发的,核心部分都需要 ...

随机推荐

  1. Jmeter简单操作 取样器 ,监听器

    1.创建线程组 1.2 (1)  线程组主要包含三个参数:线程数.准备时长(Ramp-Up Period(in seconds)).循环次数. (2) 线程数:虚拟用户数.一个虚拟用户占用一个进程或线 ...

  2. 出现jupyter notebook password or token提示需要token的处理方法

    很多朋友不知道下面的情况怎么处理,我给大家介绍一个方法! 出现这种情况很简单用下面这个地址就能进去了 (注意是你自己的 不是我这个)

  3. vps+v_2_ray+proxychains

    电脑系统换到Linux快半年了,之前一直没有解决的问题是怎么上google,毕竟有些东西还是google上好找一点.最近不想复习,没想到自己成功搭了个梯子,着实把惊喜了我一把.下面记录一下过程. 首先 ...

  4. kickstart半自动安装centos系统与pxe自动安装centos系统

    一.kickstart半自动安装centos系统 关闭防火墙,关闭selinux,使用system-config-kickstart生成kickstart配置文件,启动xmanger-Passive ...

  5. numpy函数笔记(持续更新)

    numpy函数笔记 np.isin用法 np.isin(a,b) 用于判定a中的元素在b中是否出现过,如果出现过返回True,否则返回False,最终结果为一个形状和a一模一样的数组.(注意:这里的a ...

  6. tomcat在linux服务器启动时报错Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000794500000, 576716800, 0) failed; error='Cannot allocate memory' (errno=12)

    原因是内存不足了 解决办法:1.top命令查看后台进程,看哪些可以关闭 2.ps -ef |grep tomcat看哪些不用的tomcat起着,也可以从这里关 3.加大这个tomcat的内存, 在ca ...

  7. Spring boot中配置HikariCP连接池

    # jdbc_config datasourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasourc ...

  8. Mac新手必看教程——轻松玩转Mac OS

    背景: 大部分用户接触的第一个操作系统大多是windows,本人记得曾经小学的微机课也是以win98为基础学习了一众office软件.随着工作的多样化,单一的windows系统已经无法满足部分需求,而 ...

  9. Python爬取股票信息,并实现可视化数据

    前言 截止2019年年底我国股票投资者数量为15975.24万户, 如此多的股民热衷于炒股,首先抛开炒股技术不说, 那么多股票数据是不是非常难找, 找到之后是不是看着密密麻麻的数据是不是头都大了? 今 ...

  10. 程序员的开源月刊:HelloGitHub(第 54 期)

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...