如题: 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. web前端笔记(包含php+laravel)

    概况 熟悉HTML5.CSS3.JavaScript.ES6规范 熟悉JQuery框架 熟悉BootStrap 熟悉Less.Sass 熟悉Vue 熟悉Git postman Bootstrap 布局 ...

  2. Java类加载机制()

    Java类加载机制(转载) 概述 在开始正文之前,我们先看两张图 .Java平台的理解?Java最显著的特性?Java是解释执行? 先看一下java程序的执行流程图 再看一下jvm的大致物理结构图 本 ...

  3. git仓库个人和企业版新增仓库和成员

    1.首先要在本地安装一个git安装包,比如安装完之后路径是在      D:\Program Files (x86)\Git\bin\git.exe 2.访问git网址  https://gitee. ...

  4. HarmonyOS面向128KB-128MB内存终端开源

    2020年9月10日,以HDC Together为主题的2020年度华为开发者大会在东莞·松山湖举办,华为带来了HarmonyOS 2.0.EMUI 11.HMS.HUAWEI HiLink.HUAW ...

  5. Python3使用钉钉机器人推送消息(签名方式)

    import time import hmac import hashlib import base64 import urllib import json import requests impor ...

  6. HBase shell的使用记录

    1. list命令 该命令列出hbase中所有的表 hbase(main):007:0* list TABLE SYSTEM:CATALOG SYSTEM:FUNCTION SYSTEM:MUTEX ...

  7. stp域中两台switch互联接口出现两口均为root口 并且在现有stp区域中无法确定根桥设备位置;分析其原因并赋予解决办法

    stp域中两台switch互联接口出现两口均为root口 并且在现有stp区域中无法确定根桥设备位置:分析其原因并赋予解决办法 1.于上图描述了案例中当前组网环境的各交换机位置与stp状态情况  : ...

  8. Go 里的函数

    1. 关于函数 函数是基于功能或 逻辑进行封装的可复用的代码结构.将一段功能复杂.很长的一段代码封装成多个代码片段(即函数),有助于提高代码可读性和可维护性. 在 Go 语言中,函数可以分为两种: 带 ...

  9. 【FLASK】钩子函数的使用

    from flask import Flask from flask import abort app = Flask(__name__) # 在第一次请求之前调用,可以在此方法内部做一些初始化操作 ...

  10. IDEA环境配置里的一些error

    1. idea添加edit configuration 没有tomcat图标 File->Setting->Build,Execution,Deployment-->Applicat ...