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:WindowsMicrosoft.NETFrameworkv4.0.30319mscorlib.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:WindowsMicrosoft.NETFrameworkv4.0.30319mscorlib.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:WindowsMicrosoft.NETFrameworkv4.0.30319mscorlib.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:WindowsMicrosoft.NETFrameworkv4.0.30319mscorlib.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 }
原文地址:https://www.cnblogs.com/yuzk/p/5165696.html