美文网首页
C# func and action委托是什么?

C# func and action委托是什么?

作者: kevin201712 | 来源:发表于2020-10-13 18:32 被阅读0次

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

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

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

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

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

    这个是硬件设备。

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

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

    1.内存的寻址能力。

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

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

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

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

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

    8GB --->2^3*2^30 ---> 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<T>和 Action<T>

    Func<T> 此委托可代理或者封装一个最多可达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<T> 此委托可代理或者封装一个最多可达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委托是什么?

          本文链接:https://www.haomeiwen.com/subject/xjxbpktx.html