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类型
参考文献:
https://www.cnblogs.com/yuzk/p/5165696.html
https://blog.csdn.net/rye_grass/article/details/66041423
public class Program { public static void Main(string[] args) { Action actionNoParam = () => Console.WriteLine("无参无返回"); actionNoParam(); Action<string, string> ac; ac = delegate (string s1, string s2) { WriteToConsole(s1, s2); }; ac("1", "2"); ac = (s1, s2) => WriteToConsole(s1, s2); ac("3", "4"); Func<double, double, double> DoAddtion = Calculate.addtion; double result = DoAddtion(20, 30); Console.WriteLine("Func带返回参数委托做加法结果为:{0}", result); Calculate c = new Calculate(); Action<double, double> DoSubstraction = c.substraction; DoSubstraction(90, 20); } private static void WriteToConsole(string string1, string string2) { Console.WriteLine("{0}\n{1}", string1, string2); } } public class Calculate { public static double addtion(double x, double y) { return x + y; } public void substraction(double x, double y) { Console.WriteLine("Action不带返回参数委托做减法结果为:{0}", x - y); } }