博客
关于我
Func<T>、Action<T> 的区别于说明
阅读量:655 次
发布时间:2019-03-15

本文共 1882 字,大约阅读时间需要 6 分钟。

Net中的Func和Action委托是非常有用的工具,广泛应用于处理动态方法调用和支持多种参数类型的操作。以下是对Func和Action的详细介绍和示例:

Func委托

Func是一个泛型委托,主要用于执行返回值的操作,其支持多种参数类型。Func的形式包括:

  • Func<T1, T2>:接受一个T1参数并返回T2。
  • Func<T1>:显然,_func_委托也支持接受零参数的情况,不过在实际应用中,通常是那种有返回值的操作。

示例

public static string SayHello(){    return "Hello";}static void Main(string[] args){    Func
say = SayHello; Console.WriteLine(say()); Console.ReadKey();}

在这个示例中,Func<string>被赋值了一个返回字符串的方法SayHello(), 然后被调用。

Lambda式调用

Func
say = m => m + m;Console.WriteLine(say("abc")); // 输出abcabc

这个例子中,Lambda函数接受一个字符串参数,并将其复制返回。

常见用途

最常见的用途之一是Linq中的扩展方法。例如,System.Linq中的Sum方法接受一个Func<TSource, TResult>,这样它就可以在枚举集合上执行自定义的转换函数。

Action委托

Action是处理没有返回值的操作的委托,同样支持多种参数类型。它的形式包括:

  • Action<T1>
  • Action<T1, T2>
  • Action<T1, T2, T3>
  • Action<T1, T2, T3, T4>

示例

private delegate void Say();public static void SayHello(string str){    Console.WriteLine(str);}static void Main(string[] args){    Action
say = SayHello; say("abc"); Console.ReadKey();}

这里,Action<string>被赋值了一个无返回值的方法SayHello(), 然后被调用。

Func和Action的区别

  • 返回类型:Func(delegate)可以传递返回类型,因此它适合处理有返回值的操作。
  • 参数类型:Action(delegate)只支持参数类型,不能传递返回值。
  • 执行方式:Func委托的实例需要调用(). invoke()方法,而Action委托则调用().Invoke()。

Lambda式

A:没有参数

public static void NoParam(){    DelLambda delLambda = () => { return "1"; };    Console.WriteLine("没有参数 返回值:{0}", delLambda());}

这是一个没有参数的委托,可以用于无条件执行操作。

B: 有参数

public static void TwoParam(){    DelLambdaTwo delLambdaTwo = (p1, p2) => { return p1 * p2; };    Console.WriteLine("{0}*{1}={2}", 10, 2, delLambdaTwo(10, 2));}

这个例子中,Lambda函数接受两个参数,并将它们相乘返回。

常用的委托实现

在Net代码中,常见的Func或Action的实现可以通过泛型指令来执行:

Action(() => { /* 操作 */ });Func
(() => { /* 操作 */ });

Action和Func的使用可以大幅简化代码编写,特别是在对多个操作进行动态调用时。

总结

Func和Action为开发者提供了便捷的方法来处理各种类型的操作,无论是需要返回值还是无返回值,多参数还是零参数。选择使用哪一个取决于操作的需求:Func用于有返回值的操作,Action用于无返回值的操作。掌握这些工具能够使代码更加简洁和灵活。在实际应用中,尤其是涉及到Linq或其他扩展方法时,理解Func和Action的作用显得尤为重要。

转载地址:http://dsjmz.baihongyu.com/

你可能感兴趣的文章
SQL Server 复制 订阅与发布
查看>>
OSPF技术连载20:OSPF 十大LSA类型,太详细了!
查看>>
OSPF技术连载21:OSPF虚链路,现代网络逻辑连接的利器!
查看>>
OSPF技术连载22:OSPF 路径选择 O > O IA > N1 > E1 > N2 > E2
查看>>
OSPF技术连载5:OSPF 基本配置,含思科、华为、Junifer三厂商配置
查看>>
OSPF技术连载8:OSPF认证:明文认证、MD5认证和SHA-HMAC验证
查看>>
OSPF故障排除技巧
查看>>
OSPF的七种类型LSA
查看>>
OSPRay 开源项目教程
查看>>
OS模块
查看>>
OS第3章 —— 进程调度和死锁
查看>>
overlay(VLAN,VxLAN)、underlay网络、大二层概述
查看>>
OWASP漏洞原理<最基础的数据库 第二课>
查看>>
OWL本体语言
查看>>
P with Spacy:自定义文本分类管道
查看>>
P1364 医院设置
查看>>
P2260 [清华集训2012]模积和
查看>>
SpringBoot中集成influxdb-java实现连接并操作Windows上安装配置的influxDB(时序数据库)
查看>>
Padding
查看>>
paddlehub安装及对口罩检测
查看>>