.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-12-23 18:32:25