Lambda表达式的前世今生

namespace ConSole
{
    public class Delegates
    {
        public delegate void DeleGatemodel1();
        public delegate void DeleGatemodel2(int x, int y);
        public delegate string DeleGatemodel3();
        public delegate int DeleGatemodel4(int x, int y);


    }

    /// <summary>
    /// Lambda表达式的前世今生
    /// </summary>
    public class ActionShow
    {
        /// <summary>
        /// 最初形式
        /// </summary>
        public static void LambdaAction1()
        {
            Delegates.DeleGatemodel2 metod1 = new Delegates.DeleGatemodel2(
                delegate (int x, int y)
                {
                    Console.WriteLine("x的值为{0},y的值为{1}", x, y);
                });
            metod1.Invoke(2, 3);
        }

        public static void LambdaAction2()
        {
            //箭头左边是参数,右边是方法体
            Delegates.DeleGatemodel2 metod1 = new Delegates.DeleGatemodel2(
                (int x, int y) =>
                {
                    Console.WriteLine("x的值为{0},y的值为{1}", x, y);
                });
            metod1.Invoke(2, 3);
        }

        public static void LambdaAction3()
        {
            Delegates.DeleGatemodel2 metod1 = new Delegates.DeleGatemodel2(
                (x, y) => //参数类型去掉,原因:传入的方法必须满足委托的约束
                {
                    Console.WriteLine("x的值为{0},y的值为{1}", x, y);
                });
            metod1.Invoke(2, 3);
        }

        public static void LambdaAction4()
        {

            Delegates.DeleGatemodel2 metod1 = (x, y) => //去除 new Delegates.DeleGatemodel2(
            {
                Console.WriteLine("x的值为{0},y的值为{1}", x, y);
            };
            metod1.Invoke(2, 3);
        }

        public static void LambdaAction5()
        {
            //去除大括号,条件:方法体只有一行
            Delegates.DeleGatemodel2 metod1 = (x, y) => Console.WriteLine("x的值为{0},y的值为{1}", x, y);
            metod1.Invoke(2, 3);
        }

        //===============================================================================================
        /// <summary>
        /// Lambda表达式使用1
        /// </summary>
        public static void LambdaAction7()
        {
            Delegates.DeleGatemodel2 metod1 = (x, y) => Console.WriteLine("x的值为{0},y的值为{1}", x, y);
            metod1.Invoke(1, 2);
        }

        //结论:Lambda是一个匿名方法

        //================================================================================================
        //写一个带参数待返回值
        public static void LambdaAction8()
        {
            Delegates.DeleGatemodel4 metod = (x, y) => { return x + y; };
            //简化
            Delegates.DeleGatemodel4 metod1 = (x, y) => x + y;
        }

        //写一个无参无返回值
        public static void LambdaAction9()
        {
            Delegates.DeleGatemodel1 metod = () => { };
            Delegates.DeleGatemodel1 metod1 = () => { Console.WriteLine("这里可以进行一些操作!"); };
            
        }
        
        //写一个无参有返回值
        public static void LambdaAction10()
        {
            Delegates.DeleGatemodel3 metod = () => "";
            Delegates.DeleGatemodel3 metod1 = () => { return ""; };
        }

        //================================================================================================
        //系统自带委托

        //有参无返回值
        Action at = () => { };//无参无返回值
        Action<string> at1 = x => { };//按f12 public delegate void Action<in T>(T obj);
        //这路最多只有16个参数
        Action<string, int, long, Action> at2 = (x, y, z, t) => { };

        //无参带返回值 f12=public delegate TResult Func<out TResult>();
        Func<string> fc = () => { return ""; };
        Func<string> fc1 = () => "";

        public static void LambdaAction11()
        {
            Action ac = () => { };
            //有参有返回值
            Func<string,int, Action> fc3 = (x, a) => ac;
        }
        
    }
}

  

posted @ 2018-01-26 10:50  野码  阅读(218)  评论(0编辑  收藏  举报