C#基础:委托之Action和Func、Predicate的用法

Action、Action<T>:

①、Action委托的方法没有参数也没有返回值

②、Action<T>是Action的泛型实现

③、Action<T>委托类存在不同的变体,可以传递至多16种不同的参数类型

④、没有泛型参数的Action类可以调用没有参数的方法

例如:Action<in T1>调用带一个参数的方法,Action<in T1, in T2>调用带两个参数的方法等

Func<T>:

①、Func<T>的用法和Action<T>用法类似,但是Func<T>表示引用一个带返回类型的方法

②、Func<T>也存在不同的变体,至多可以传递16个参数类型和1个返回类型

例如:Func<in T1, out Resout>表示带一个参数的方法,Func<in T1, in T2, out Resout>表示调用带两个参数的方法

Predicate<T>:

①、委托的方法有bool类型的返回值,等效于Func<T, bool>

结论:

①、Func<T, bool>是对delegate bool Predicate<T>(T obj)的简化,
②、Predicate<T>又是对Func<T, bool>的简化,
③、List<T>中的方法应该统一参数。
④、Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型
⑤、Func可以接受0个至16个传入参数,必须具有返回值
⑥、Action可以接受0个至16个传入参数,无返回值
⑦、Predicate只能接受一个传入参数,返回值为bool类型

 1 using System;
 2 
 3 public class Program {
 4       public static void Main(string[] args) {
 5         Action actionNoParam = () => Console.WriteLine("无参无返回");
 6         actionNoParam();
 7 
 8         Action<string, string> ac;
 9         ac = delegate(string s1, string s2) { WriteToConsole(s1, s2); };
10         ac("1", "2");
11         ac = (s1, s2) => WriteToConsole(s1, s2);
12         ac("3", "4");
13 
14         Func<double, double, double> DoAddtion = Calculate.addtion;
15         double result = DoAddtion(20, 30);
16         Console.WriteLine("Func带返回参数委托做加法结果为:{0}", result);
17 
18         Calculate c = new Calculate();
19         Action<double, double> DoSubstraction = c.substraction;
20         DoSubstraction(90, 20);
21         }
22 
23       private static void WriteToConsole(string string1, string string2){
24         Console.WriteLine("{0}\n{1}", string1, string2); 
25       }
26 }
27 
28 public class Calculate {
29     public static double addtion(double x, double y) {
30         return x + y;
31     }
32 
33     public void substraction(double x, double y) {
34         Console.WriteLine("Action不带返回参数委托做减法结果为:{0}", x - y);
35     }
36 }

参考文献:

https://www.cnblogs.com/yuzk/p/5165696.html

https://blog.csdn.net/rye_grass/article/details/66041423

猜你喜欢

转载自www.cnblogs.com/renyan52099/p/10272278.html