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雷同。这里就不在说了。希望自己的总结能够对大家有所帮助。

 

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

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

(0)
上一篇 2022年2月4日 上午11:00
下一篇 2022年2月4日 上午11:00


相关推荐

  • linux cat /etc/passwd 说明

    linux cat /etc/passwd 说明

    2021年10月27日
    97
  • Python基础知识归纳「建议收藏」

    Python基础知识归纳「建议收藏」Python基础教程Python基础教程Python简介Python环境搭建Python中文编码Python基础语法Python变量类型Python运算符Python条件语句Python循环语句PythonWhile循环语句Pythonfor循环语句Python循环嵌套Pythonbreak语句Python…

    2022年10月16日
    3
  • jeecg主从数据库读写分离配置「建议收藏」

    1、修改Dbconfig.properties数据库配置文件:注意:从库属性的名字要与主库的属性名字区分开,属性名将会在后面的配置文件中用到。#数据库配置主库-写入库#MySQLhibernate.dialect=org.hibernate.dialect.MySQLDialectvalidationQuery.sqlserver=SELECT1jdbc.url=jdbc\:mys…

    2022年4月16日
    42
  • vue 基于eleui的自定义穿梭框Transfer

    vue 基于eleui的自定义穿梭框Transfer最近在写公司业务的时候 有需要用到 transfer 的业务场景 但是 ele 给的穿梭框组件并不是很符合期望要求 故自己基于 eleui 手写了一个穿梭框 效果如下 具体代码如下 给大家一个参考 template divclass hello divclass transfer 左侧列表 divclass card divclass card divclass transfer divclass hello template

    2026年3月19日
    2
  • Hunyuan-MT 7B新手教程:双列界面快速翻译操作指南

    Hunyuan-MT 7B新手教程:双列界面快速翻译操作指南

    2026年3月13日
    2
  • Orcle分页

    Orcle分页Orcle 分页在了解 orcle 分页前让我们先了解一下 行号 rownum 与物理地址的概念 1 rownum 行号注意 select 操作时就会执行每出一行记录 该行就会加一个行号 行号不属于一张表 nbsp 补充 nbsp 行号必须是从 1 开始的 会依次递增 不会跳着做 eg 如 1 到 5 nbsp 行号不属于任何一张表 不能用表名 rownum nbsp 2 rowid 行物理地址行物理地址和

    2026年3月16日
    3

发表回复

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

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