C Func<>委托

C Func<>委托以前我们为了能够调用一个方法 必须比照这个方法定义一个相应的 delegate 原先我们定义 delegate 委托声明定义一个签名 delegatedoub doublenum classDelegat 符合委托声明的常规方法 staticdouble doublei

以前我们为了能够调用一个方法,必须比照这个方法定义一个相应的delegate.

原先我们定义delegate

// 委托声明 -- 定义一个签名: delegate double MathAction(double num); class DelegateTest { // 符合委托声明的常规方法 static double Double(double input) { return input * 2; } static void Main() { 原版: // 使用一个命名方法实例化委托类型 MathAction ma = Double; // 调用委托实例 double multByTwo = ma(4.5); Console.WriteLine(multByTwo); 简化版1: // 再用匿名方法来实例化委托类型 MathAction ma2 = delegate(double input) { return input * input; }; double square = ma2(5); Console.WriteLine(square); 简化版2: // 最后用Lambda表达式来实例化委托类型 MathAction ma3 = s => s * s * s; double cube = ma3(4.375); Console.WriteLine(cube); } }

这个是否能有更好的实现办法呢?

答案是:肯定有了.也就是有通用的delegate了。在.NETFramework 3.5中,提供了两类通用的delegate。

如果方法有返回值,则使用Func,或者Func<>

如果方法没有返回值,则使用Action,或者Action<>

Func

(T arg)

参数类型

T

此委托封装的方法的参数类型。

TR

此委托封装的方法的返回值类型。

参数

arg

类型 T

此委托封装的方法的参数。

 

在使用 Func

委托时,不必显式定义一个封装只有一个参数的方法的委托。以下示例简化了此代码,它所用的方法是实例化 Func

委托,而不是显式定义一个新委托并将命名方法分配给该委托。

使Func<>委托,我们这样写

using System; public classLambdaExpression { public static void Main() { Func 
        
          convert = s=> s.ToUpper();//该方法将小写字母转为大写 string name = "Dakota"; Console.WriteLine(convert(name)); } } 
        

Func委托是system下的全局函数,不用我们自定,系统自定义的,供我们使用,带有多个重载.

这里我们除了使用Func委托外,还是用了Labdab表达式.这里我再谈谈这个表达式.

Lambda表达式的基础类型是泛型 Func委托之一。 这样能以参数形式传递 lambda表达式,而不用显式将其分配给委托。 尤其是,因为 System.Linq命名空间中许多类型方法具有Func

参数,因此可以给这些方法传递 lambda表达式,而不用显式实例化 Func

委托。

下面一行代码将生成一个序列,其中包含 numbers 数组中在 9左侧的所有元素,因为它是序列中第一个不满足条件的数字:

int[] n= { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var firstNumbersLessThan6 = numbers.TakeWhile(n => n < 6);

实例2

var firstSmallNumbers =numbers.TakeWhile((n, index) => n >= index);

此示例展示了如何通过将输入参数括在括号中来指定多个输入参数。该方法将返回数字数组中的所有元素,直至遇到一个值小于其位置的数字为止。不要将 lambda运算符 (=>)与大于等于运算符 (>=)混淆。

三种委托写法对比

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace func { //委托声明 -- 定义一个签名: delegate double MathAction(double num); public class Program { // 符合委托声明的常规方法 static double Double(double input) { return input * 2; } static void Main(string[] args) { // 使用一个命名方法实例化委托类型 /* * 写法一,需要写出专门委托的函数,还需要自定义委托 / MathAction ma = Double;//注意这里千万不可有Double(),否则就成了一个返回类型,是报错的,这里是制定函数的地址,给定的是函数的地址 //调用委托 double result1 = ma(4.5); //使用系统自定义委托实例化委托类型 /* * 写法二,需要写出专门委托的函数,不需要自定义委托,使用系统委托 / Func                   func = Double; //调用委托 double result2 = func(4.5); //系统委托使用lamdba进行传递参数 /* * 写法三,不需要写出专门委托的函数,还需要自定义委托 / Func                     result = s=> s * 2;//写法还可以换成lamdba语句块,适应多个参数的写法 double result3=result(4.5); Func                       result4 = s => { return s * 2; }; Console.WriteLine(result1); Console.WriteLine(result3); Console.WriteLine(result2); Console.WriteLine(result4(4.5)); } } }                              

效果图

C Func<>委托

同样的输出效果,但是编写代码的质量确有不同。当然了也是要对自己的问题进行负责的。lamdba的使用简化的代码,但是如果自己不是对这个很熟悉,很容易造成出现问题,如从着手错误的源泉。匿名函数的写法解决的这个问题。但是匿名函数却没有Lamdba简便。这就是折中方法吧。看自己更喜欢哪种了。

小结:

从Func的委托中,我们可以看出,它简化了我们自己定义委托带来的繁琐,同时它更好的结合了Lamdba的使用。减少了自定义函数的作用。同时也是有缺点的,就是错误的出现不容易发现是那里。Action委托的使用与Func雷同,这里就不在说了。希望自己的总结可以对大家有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203491.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午9:43
下一篇 2026年3月19日 下午9:43


相关推荐

  • atop用法_安装atop笔记

    atop用法_安装atop笔记1 直接下载源码安装 https www atoptool nl download atop 2 x x tar gz 此时是 2 4 0 版的即 https www atoptool nl download atop 2 4 0 tar gz 2 解压 tar zxvfatop 2 4 0 tar gz3 进入目录 编译 不过编译遇到了了 zlib 和 curses 库缺少 最好

    2026年3月18日
    2
  • 通关必读—linux面试题(带答案)

    通关必读—linux面试题(带答案)答案linux考试题1.在登录Linux时,一个具有唯一进程ID号的shell将被调用,这个ID是什么(b)A.NIDB.PIDC.UIDC.CID答:w命令查看用户tty终端信息ps-ef|greppts/02.下面那个用户存放用户密码信息(b)A./bootB./etcC./varD./dev3.用于自动补全功能时,输入命令或文件的前1个或后几个字母按什么键(b…

    2022年6月5日
    278
  • BeanUtils.populate的用法

    BeanUtils.populate的用法BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate

    2022年7月26日
    7
  • python encoding=utf-8_python以utf8打印字符串

    python encoding=utf-8_python以utf8打印字符串之前写程序时也出现过类似错误,每次解决了到第二次遇见又忘了具体方法,这次记录一下。一、字符编码问题先介绍一下字符编码问题1.ASCLL与GB2312由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。但是要处理中文显然一个字节是不够的,至…

    2026年4月15日
    4
  • python创意turtle作品-Python创意编程200例turtle篇

    简介:Python是一种高阶计算机语言。它更接近自然语言,学习成本低,开发效率高。如今越来越多的中小学生都在开始学习Python了。我们可以预见,全民会Python的日子不久就会到来,各行各业的人未来都能用Python解决各自领域的问题或创造出独特魅力的作品。在Python的普及过程中,海龟模块(turtle)将会功不可没。它来源于上个世纪60年代的logo计算机语言,就是通过指挥一只小海龟移动…

    2022年4月8日
    97
  • 常用邮件服务器软件(邮件服务器软件哪个好)

    常见邮件服务器软件1.微软ExchangeServer[3]​2.TurboMail3.Coremail4.U-Mail5.lifecube网络宝邮件服务器6.MDaemonServer7.WinWebMail8.IceWarp/MerakMailServer9.LotusDomino/Notes10.Postfix/Sendmail/Qm…

    2022年4月17日
    64

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号