Action、Action<T>、Func<T>、Predicate<T>

.net4.0新出了几个委托Action、 Action<T>、Func<T>、Predicate<T>,其本质上都是delegate关键字来声明的,待会下面原型大家可以看到,以前我们一般使用delegate关键字来使用委托,但是如果我们的.net为4.0或者以上版本的时候,我们要用到委托的时候,尽量不要自己再定义一 个委托了,就用系统内置的这几个已经能够满足大部分的需求,且让代码符合规范,显得比较有档次,哈哈。

  • 1.Action  场景:委托的方法没有参数也没有返回值

Action封装的方法没有参数也没有返回值,声明原型为(这里推荐一下JetBrains的dotpeek插件,可以非常方便的阅读源代码):

 1 // Decompiled with JetBrains decompiler
 2 // Type: System.Action
 3 // Assembly: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
 4 // MVID: 2A55D587-43EC-479C-866B-425E85A3236D
 5 // Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
 6
 7 using System.Runtime.CompilerServices;
 8
 9 namespace System
10 {
11   /// <summary>
12   /// 封装一个方法,该方法不具有参数并且不返回值。
13   /// </summary>
14   [TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]
15   [__DynamicallyInvokable]
16   public delegate void Action();
17 }

用法如下:

 1 #region
 2
 3 using System;
 4
 5 #endregion
 6
 7 namespace ConsoleApplication1
 8 {
 9     internal class Program
10     {
11         private static void Main(string[] args)
12         {
13             Action actionNoParam = () => Console.WriteLine("Action Demo");
14             actionNoParam();
15
16             Console.ReadKey();
17         }
18     }
19 }
  • 2.Action<T>  场景:委托的方法有参数但是没有返回值

Action<T>是Action的泛型实现,也是没有返回值,但可以传入最多16个参数,声明原型为

 1 // Decompiled with JetBrains decompiler
 2 // Type: System.Action`8
 3 // Assembly: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
 4 // MVID: 2A55D587-43EC-479C-866B-425E85A3236D
 5 // Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
 6
 7 namespace System
 8 {
 9   /// <summary>
10   /// 封装一个方法,该方法具有八个参数并且不返回值。
11   /// </summary>
12   /// <param name="arg1">此委托封装的方法的第一个参数。</param><param name="arg2">此委托封装的方法的第二个参数。</param><param name="arg3">此委托封装的方法的第三个参数。</param><param name="arg4">此委托封装的方法的第四个参数。</param><param name="arg5">此委托封装的方法的第五个参数。</param><param name="arg6">此委托封装的方法的第六个参数。</param><param name="arg7">此委托封装的方法的第七个参数。</param><param name="arg8">此委托封装的方法的第八个参数。</param><typeparam name="T1">此委托封装的方法的第一个参数类型。此类型参数是逆变。即可以使用指定的类型或派生程度更低的类型。有关协变和逆变的详细信息,请参阅 泛型中的协变和逆变。</typeparam><typeparam name="T2">此委托封装的方法的第二个参数类型。</typeparam><typeparam name="T3">此委托封装的方法的第三个参数类型。</typeparam><typeparam name="T4">此委托封装的方法的第四个参数类型。</typeparam><typeparam name="T5">此委托封装的方法的第五个参数的类型。</typeparam><typeparam name="T6">此委托封装的方法的第六个参数的类型。</typeparam><typeparam name="T7">此委托封装的方法的第七个参数的类型。</typeparam><typeparam name="T8">此委托封装的方法的第八个参数的类型。</typeparam><filterpriority>2</filterpriority>
13   [__DynamicallyInvokable]
14   public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);
15 }

用法如下:

 1 #region
 2
 3 using System;
 4
 5 #endregion
 6
 7 namespace ConsoleApplication1
 8 {
 9     internal class Program
10     {
11         private static void Main(string[] args)
12         {
13             Action<int, int, int> actionWithparam = (a, b, c) => Console.WriteLine(a + b - c);
14             actionWithparam(1, 2, 3);
15
16             Console.ReadKey();
17         }
18     }
19 }
  • 3.Func<T>   场景:委托的方法有返回值

Func<T>委托始终都会有返回值,返回值的类型是参数中最后一个,最少传入一个参数,且此参数是输出参数,也可以最多传入16个参数,其声明原型为:

 1 // Decompiled with JetBrains decompiler
 2 // Type: System.Func`3
 3 // Assembly: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
 4 // MVID: 2A55D587-43EC-479C-866B-425E85A3236D
 5 // Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
 6
 7 using System.Runtime.CompilerServices;
 8
 9 namespace System
10 {
11   /// <summary>
12   /// 封装一个具有两个参数并返回 <paramref name="TResult"/> 参数指定的类型值的方法。
13   /// </summary>
14   ///
15   /// <returns>
16   /// 此委托封装的方法的返回值。
17   /// </returns>
18   /// <param name="arg1">此委托封装的方法的第一个参数。</param><param name="arg2">此委托封装的方法的第二个参数。</param><typeparam name="T1">此委托封装的方法的第一个参数类型。此类型参数是逆变。即可以使用指定的类型或派生程度更低的类型。有关协变和逆变的详细信息,请参阅 泛型中的协变和逆变。</typeparam><typeparam name="T2">此委托封装的方法的第二个参数类型。</typeparam><typeparam name="TResult">此委托封装的方法的返回值类型。此类型参数是协变。即可以使用指定的类型或派生程度更高的类型。有关协变和逆变的详细信息,请参阅 泛型中的协变和逆变。</typeparam><filterpriority>2</filterpriority>
19   [TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]
20   [__DynamicallyInvokable]
21   public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
22 }

用法如下:

 1 #region
 2
 3 using System;
 4
 5 #endregion
 6
 7 namespace ConsoleApplication1
 8 {
 9     internal class Program
10     {
11         private static void Main(string[] args)
12         {
13             Func<int, int, bool> func = (a, b) => a == b;
14             Console.WriteLine(func(1, 2));
15             Console.ReadKey();
16         }
17     }
18 }
  • 4.Predicate<T>   场景:委托的方法有bool类型的返回值

Predicate<T>表示定义一组条件并确定指定对象是否符合这些条件的方法.此方法常在集合的查找中被用到,如:数组,正则拼配的结果集中被用到,返回值只能为bool类型,声明原型为:

 1 // Decompiled with JetBrains decompiler
 2 // Type: System.Predicate`1
 3 // Assembly: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
 4 // MVID: 2A55D587-43EC-479C-866B-425E85A3236D
 5 // Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
 6
 7 namespace System
 8 {
 9   /// <summary>
10   /// 表示定义一组条件并确定指定对象是否符合这些条件的方法。
11   /// </summary>
12   ///
13   /// <returns>
14   /// 如果 <paramref name="obj"/> 符合由此委托表示的方法中定义的条件,则为 true;否则为 false。
15   /// </returns>
16   /// <param name="obj">要按照由此委托表示的方法中定义的条件进行比较的对象。</param><typeparam name="T">要比较的对象的类型。此类型参数是逆变。即可以使用指定的类型或派生程度更低的类型。有关协变和逆变的详细信息,请参阅 泛型中的协变和逆变。</typeparam><filterpriority>2</filterpriority>
17   [__DynamicallyInvokable]
18   public delegate bool Predicate<in T>(T obj);
19 }

用法如下:

 1 #region
 2
 3 using System;
 4 using System.Collections.Generic;
 5
 6 #endregion
 7
 8 namespace ConsoleApplication1
 9 {
10     internal class Program
11     {
12         private static void Main(string[] args)
13         {
14             List<int> list = new List<int>
15             {
16                 1,
17                 2,
18                 3,
19                 4,
20                 5
21             };
22             Predicate<int> predicate = (value) => value > 3;
23             Console.WriteLine(list.Find(predicate));
24             Console.ReadKey();
25         }
26     }
27 }
时间: 2024-10-01 18:13:25

Action、Action<T>、Func<T>、Predicate<T>的相关文章

Func&lt;T&gt;、Action&lt;T&gt; 的区别于说明

一.Func Func是一个.Net内置的委托. Func<Result>,Func<T1,Result>是一个.Net内置的泛型委托. Func<TResult> Func<T,TResult> Func<T1,T2,TResult> Func<T1,T2,T3,TResult> Func<T1,T2,T3,T4,TResult> 它有5种形式,只是参数个数不同:第一个是无参数,但是有返回值: 下面是一个简单的普通委托来

C#委托Action、Action&lt;T&gt;、Func&lt;T&gt;、Predicate&lt;T&gt;

CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个委托了,就用系统内置的这几个已经能够满足大部分的需求,且让代码符合规范. 一.Action Action封装的方法没有参数也没有返回值,声明原型为: 1 public delegate void Action(); 用法如下: 1 public void Alert() 2 { 3 Console.Write

通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系

一直以来都是对于事件与委托比较混淆,而且不太会用.找了个时间,总结了一下,感觉清晰了很多. 先说一下个人理解的结论吧: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类. delegate声明的变量与delegate声明的事件,并没有本质的区别,事件是在delegate声明变量的基础上包装而成的,类似于变量与属性的关系(在IL代码中可以看到每一个delegate声明的事件都对应是私有的delegate声明的变量),提升了安全性. Action 与Func:这两个其实

关于Action&lt;T&gt; 、Func&lt;T&gt;、EventHandler&lt;T&gt;、event、delegate

c# 最初的时候 只有 delegate,之后的版本封装了Action<T> .Func<T>.EventHandler<T> 关于Action<T>  实际上Action<T>  等同于旧版的 public delegate void Action(); public delegate void Action<T1>(T1 arg1); public delegate void Action<T1, T2>(T1 arg

[转]C#委托Action、Action&lt;T&gt;、Func&lt;T&gt;、Predicate&lt;T&gt;

CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个委托了,就用系统内置的这几个已经能够满足大部分的需求,且让代码符合规范. 一.Action Action封装的方法没有参数也没有返回值,声明原型为: 1 public delegate void Action(); 用法如下: 复制代码 1  public void Alert() 2  { 3     Co

.net中的各种委托(Delegate、Action、Func)

1.Delegate,委托的鼻祖 protected delegate int ClassDelegate(int x, int y);//定义委托类型及参数 static void Main(string[] args) { ClassDelegate dele = new ClassDelegate(Add);//实例化一个委托 Console.WriteLine(dele(1, 2));//调用委托 Console.ReadKey(); } static int Add(int a, in

C#中常见的委托(Func委托、Action委托、Predicate委托)

今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如下的5种类型: (1) *delegate TResult Func<TResult>(); (2)*delegate TResult Func<T1,TResult>(T1 arg1); (3) *delegate TResult Func&

C# 中的delegate、event、Action、Func

缘起: 之前一直很纠结C#中(delegate.event.Action.Func)的用法,这么多方法,感觉每次使用的时候好像都没啥区别,老感觉微软有多此一举之嫌,不过今天花了点时间好好研究了下,才发现他们实质上的区别. 解惑: 我发现,这四种类型中不管哪种,其实都属于委托,只是展现的形式不同而已,无论哪种,其实都可以采用delegate实现,为什么会衍生出其他三种形式,我猜是为了方便开发者使用,因为我们会发现定义一个delegate其实还是蛮费劲的,至少会比其他三种多一条定义语句,使用起来也不

C#委托(delegate、Action、Func、predicate)和事件

一.前言 刚开始工作的时候,觉得委托和事件有些神秘,而当你理解他们之后,也觉得好像没有想象中的那么难.在项目中运用委托和事件,你会发现他非常棒,这篇博文算是自己对委托和事件的一次梳理和总结. 二.委托 C#中的委托,相当于C++中的指针函数,但委托是面向对象的,是安全的,是一个特殊的类,当然他也是引用类型,委托传递的是对方法的引用. 2.1.delegate 声明委托就必须使用关键字“delegate”,委托是先声明,后实例化.至少0个参数,至多32个参数 格式如下所示: private del