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);
        }
    }
posted @ 2021-02-08 09:37  狼王爷  阅读(519)  评论(0编辑  收藏  举报