zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    jupyterlab数据处理
    系统监测模块
    登录验证码的实现
    编码格式检测chardet模块
    图像处理pillow模块
    内存数据的读取
    力扣(LeetCode)728. 自除数
    力扣(LeetCode)709. 转换成小写字母
    Java 层序创建和遍历二叉树
    力扣(LeetCode) 849. 到最近的人的最大距离
  • 原文地址:https://www.cnblogs.com/yuzk/p/5165696.html
Copyright © 2011-2022 走看看