C# Func<>托付「建议收藏」

C# Func<>托付

大家好,又见面了,我是全栈君。

曾经我们为了可以调用一个方法。必须比照这种方法定义一个对应的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,TR>(T arg)

參数类型

T

此托付封装的方法的參数类型。

TR

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

參数

arg
类型 T

此托付封装的方法的參数。

 

在使用 Func<T,TResult>托付时,不必显式定义一个封装仅仅有一个參数的方法的托付。下面演示样例简化了此代码,它所用的方法是实例化 Func<T, TResult>托付,而不是显式定义一个新托付并将命名方法分配给该托付。


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

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

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

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

Lambda表达式的基础类型是泛型 Func托付之中的一个。 这样能以參数形式传递 lambda表达式,而不用显式将其分配给托付。

 尤其是,由于 System.Linq命名空间中很多类型方法具有Func<T, TResult>參数,因此能够给这些方法传递 lambda表达式。而不用显式实例化 Func<T, TResult>托付。

以下一行代码将生成一个序列,当中包括 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<double,double> func = Double; //调用托付double result2 = func(4.5); //系统托付使用lamdba进行传递參数/* * 写法三。不须要写出专门托付的函数。还须要自己定义托付 **/Func<double, double> result = s=> s * 2;//写法还能够换成lamdba语句块,适应多个參数的写法 double result3=result(4.5); Func<double,double> result4 = s =>{return s * 2;}; Console.WriteLine(result1);Console.WriteLine(result3);Console.WriteLine(result2);Console.WriteLine(result4(4.5));} } }

效果图

C# Func&lt;&gt;托付「建议收藏」

 

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

 

小结:

Func的托付中。我们能够看出,它简化了我们自定义托付带来的繁琐。同一时候它更好的结合了Lamdba的使用。降低了自定义函数的作用。同一时候也是有缺点的,就是错误的出现不easy发现是那里。

Action托付的使用与Func雷同。这里就不在说了。希望自己的总结能够对大家有所帮助。

 

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115448.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 学计算机应该怎样学,初学者该如何学习电脑知识

    学计算机应该怎样学,初学者该如何学习电脑知识看到不少刚入门的电脑刚入门者找不到适合自己的学习方法,到处碰壁,那么初学者该如何学习电脑知识呢?接下来大家跟着学习啦小编一起来了解一下学习电脑知识的解决方法吧。初学者学习电脑知识方法第一阶段:鼠标和键盘的操作鼠标的操作主要是:移动、拖动、单击、双击和右击,知道鼠标的作用以及基本操作。掌握键盘的操作,可以通过打字练习来完成,熟悉键盘排列,可以熟练打字。第二阶段:操作系统的学习对windowsxp的…

  • 验证Hibernate二级缓存的存在[通俗易懂]

    验证Hibernate二级缓存的存在[通俗易懂]一、环境的搭建请参考EHcache环境的配置二、实体类(Student.java)packagecom.hibernate.beans;publicclassStudent{privateIntegerid;privateStringname;privateintage;privatedoublescore;publicStu

  • java必背代码_Java编程中必须要死记硬背的几十个代码段

    java必背代码_Java编程中必须要死记硬背的几十个代码段向文件末尾添加内容字符串有整型的相互转换转字符串到日期java.util.Date=java.text.DateFormat.getDateInstance().parse(dateString);得到当前方法的名字StringmethodName=Thread.currentThread().getStackTrace()[1].getMethodName();使用JDBC链接O…

  • SIFT特征点提取「建议收藏」

    SIFT特征点提取「建议收藏」计算机视觉中的特征点提取算法比较多,但SIFT除了计算比较耗时以外,其他方面的优点让其成为特征点提取算法中的一颗璀璨的明珠。SIFT算法的介绍网上有很多比较好的博客和文章,我在学习这个算法的过程中也参看网上好些资料,即使评价比较高的文章,作者在文章中对有些比较重要的细节、公式来历没有提及,可能写博客的人自己明白,也觉得简单,因此就忽略了这些问题,但是对刚入门的人来说,看这些东西,想搞清楚这些是怎么

  • C++基础语法

    C++基础语法基础语法第一个程序#include<iostream>usingnamespacestd;intmain(){cout<<"H

    2021年12月13日
  • TypeError: can‘t convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory fi

    TypeError: can‘t convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory fiRuntimeError:Expectedobjectoftypetorch.cuda.FloatTensorbutfoundtypetorch.FloatTensorforargument#4’mat1’意思是:如果想把CUDAtensor格式的数据改成numpy时,需要先将其转换成cpufloat-tensor随后再转到numpy格式。numpy不能读取CU…

    2022年10月18日

发表回复

您的电子邮箱地址不会被公开。

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