浅谈C#中Action、Func与Predicate委托

前言:Action与Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托。在前面的博文中,我介绍了C#委托(Delegate),那么本博文,主要是介绍Action与Func,算是对之前博文的一个补充与扩展。参考博文:C#委托(Delegate)精讲

一、关于委托补充

委托是引用类型,可以把它看作是用来存方法的一种类型。比如说类型string用来定义存取字符串的变量,那么委托类型delegate就可以用来定义存方法的变量。委托和类一样,是一种用户自定义类型。但类表示的是数据和方法的集合,而委托表示的是一个或多个方法的集合。你可以把delegate看作一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型。

  • 方法的列表称为调用列表。

  • 委托保存的方法可以来自任何类和结构,只要它们在下面两点匹配:

    1. 委托的返回类型
    2. 委托的签名(包括ref和out修饰符)
  • 调用列表中的方法可以是实例方法,也可以是静态方法

  • 在调用委托的时候,会执行其调用列表中的所有方法

除了我们自己定义的委托之外,系统还为我们提供过来一个内置的委托类型,Action与Func。其中Action委托引用了一个void返回类型的方法。Func引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型。

二、Action委托

Action委托签名不提供返回类型,它具有Action、Action<T1,T2>、Action<T1,T2,T3>……Action<T1,……T16>多达16个的重载,其中传入参数均采用泛型中的类型参数T,涵盖了几乎所有可能存在的无返回值的委托类型。

例如:

private static void Print()
{
    Console.WriteLine("我是一个普通的输出方法");
}
private static void Add(int a,int b)
{
    Console.WriteLine("a+b的值为{0}",a+b);
}

private static void Adds(string name,int age)
{
    Console.WriteLine("我的名字叫:{0},今年{1}岁",name,age);
}
public static void Main(string[] args)
{
    Action ac1 = Print; // Action是系统内置(预定义)的一个委托类型,它可以指向一个没有返回值,没有参数的方法
    ac1();
    Action<int, int> ac2 = Add; // 定义了一个委托类型,这个类型可以指向一个没有返回值,有两个int参数的方法
    ac2(3, 4);
    Action<string, int> ac3 = Adds; // Action可以后面通过泛型去指定Action指向的方法的多个参数的类型,参数的类型跟Action后面声明的委托类型是对应的
    ac3("张三", 23);
}

执行效果:
在这里插入图片描述

三、Func委托

Func具有Func<TResult>、Func<T,Tresult>、Func<T1,T2,T3……,Tresult>17种类型重载,T1……T16为出入参数,Tresult为返回类型。

例如:

private static int Test()
{
    return 1;
}

private static int Mes(string name)
{
    Console.WriteLine("我的名字叫:"+name);
    return 100;
}

private static int Add(int a, int b)
{
    return a + b;
}

public static void Main(string[] args)
{
    Func<int> fu1 = Test; // Func中的泛型类型指定的是方法的返回值类型
    int res1 = fu1();
    Console.WriteLine(res1);
    Func<string,int> fu2 = Mes; // Func后面可以跟很多类型,最后一个类型是返回值类型,前面的类型是参数类型,参数类型必须跟指向的方法的参数类型安装顺序对应
    int res2 = fu2("李四");
    Console.WriteLine(res2);
    Func<int,int,int> fu3 = Add; // Func后面必须指定一个返回值类型,参数类型可以有0~16个,先写参数类型,最后一个是返回值类型
    int res3 = fu3(2,3); 
    Console.WriteLine(res3);
}

执行效果:
在这里插入图片描述

四、Predicate委托

  1. Predicate是返回bool型的泛型委托
  2. Predicate<int>表示传入参数为int,返回bool的委托
  3. Predicate有且只有一个参数,返回值固定为bool

例如:

private static bool isEqual(bool b)
{
    return b;
}

public static void Main(string[] args)
{
    Predicate<bool> pre = isEqual; // Predicate是返回bool型的泛型委托,故泛型里只能是bool,它有且只有一个参数
    bool res = pre(2>1);
    Console.WriteLine(res);
}

执行效果:
在这里插入图片描述

五、委托特点与异同

1、特点

  1. 委托类似于C++函数指针,但它们是类型安全的。
  2. 委托允许将方法作为参数进行传递。
  3. 委托可用于定义回调方法。
  4. 委托可以链接在一起;例如,可以对一个事件调用多个方法。
  5. 方法不必与委托签名完全匹配。

2、异同

  1. Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。
  2. Func可以接受0个至16个传入参数,必须具有返回值。
  3. Action可以接受0个至16个传入参数,无返回值。
  4. Predicate只能接受一个传入参数,返回值为bool类型。

猜你喜欢

转载自blog.csdn.net/qq_44034384/article/details/106772256