手机版

使用中的Action和Func泛型委托进行深入分析 NET

时间:2021-10-06 来源:互联网 编辑:宝哥软件园 浏览:

委托在C#编程中扮演着极其重要的角色。委托可以将函数封装到委托对象中,多个委托可以合并到一个委托中。委托可以像普通对象一样存储和传输,然后随时调用。因此,C#中函数回调机制的实现基本上依赖于委托。C#的delegate关键字用于声明委托,它能够将声明的委托类型映射到System。委托类,位于mscorlib.dll,是的基本核心类之一。NET。用delegate关键字声明委托本质上是创建一个System的派生类。委托,因此委托类型不是结构或其他类型,而是类。委托对象是类的实例。下面是Delegate类的声明:复制代码如下:公共抽象类delegate delegate是所有委托类型的基类,C#中的MulticastDelegate实际上是一个MulticastDelegate类,是System的派生类。委托,而本文介绍的Action和Func的泛型委托实际上是多播委托类的派生类型。在C#中,当我们使用delegate关键字声明委托类型时,实际上C#编译器会帮助我们生成一个与签名匹配的类,并且在声明时根据方法签名从MulticastDelegate派生。在泛型被广泛使用之前,当我们编写C#程序时,我们可能会使用delegate关键字来声明许多委托类型,因为这些类型都对应于不同的方法签名。通过Visual Studio的对象浏览器查看mscorlib,可以看到这两个重要的泛型委托:image

image

除了Action,其他所有委托都是泛型的,实际上是一些泛型类。这是。NET核心库。这些通用委托分为功能委托和操作委托。在泛型功能的帮助下,它们可以替换C#中几乎所有的委托类型,这意味着一般来说,我们可以包装所有的函数,而无需在程序中声明任何新的委托类型。例如,我们有两种方法:复制代码如下: public static void otput string(string str){ console。writeline(字符串);}public static int Add(int a,int b){ return a b;}与Action相比,}Func泛型委托有一个额外的TResult类型参数,当函数有返回值时使用,Action泛型委托用于没有返回值的函数。当我们想要获得这两个方法的委托对象时,可以改变这一点。复制代码如下: VAR Action=New Action string(otputString);操作(' OutputString已调用!');var func=new Funcint,int,int(Add);var sum=func(3,5);控制台。write line(sum);可以看到,当我们用返回值包装一个func作为委托对象时,我们使用func delegate,如果函数没有返回值,我们使用Action。核心库提供的泛型委托类型参数短至0,长至8。因此,Action及其泛型委托可以匹配任何没有返回值且参数数量从0到8的函数。同样,Func泛型委托可以匹配返回值为0到8个参数的任何函数。一般一个程序中函数的参数个数不会超过8个,即使超过8个,我们也可以声明一个新的泛型委托类型来应对复制代码,具体如下:委托无效动作t1、T2、T3、T4、t5、T6、T7、t8、T9 (t1p1、t2p2、t3p3、t4p4、t5 P5、t6p6、t7p、t8p8。使用这些泛型委托时不会有性能损失,这使得委托在程序中的使用风格保持一致。唯一的缺点是类型的名称不能表达具体的用途。例如,EventHandler委托,当我们查看名称时,我们知道它是事件处理的委托。使用Actionobject,EventArgs委托无法判断这种类型的委托的目的。通用委托能够替换所有其他委托。是用泛型委托还是普通委托,什么时候用,在什么情况下,每个人可能有不同的配置文件。但是,归根结底,泛型委托的优点,比如统一程序代码风格,方便随处使用,是非常显著的。

版权声明:使用中的Action和Func泛型委托进行深入分析 NET是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。