Lambda表达式演变


一.委托使用

using System;

namespace DelegateTest
{
    public delegate void D1(string message);//1.声明一个委托类型
    internal class Program
    {
        static void Main(string[] args)
        {
            D1 d1 = F1;//声明一个委托类型的变量,指向对应的方法
            F1("这是委托");//调用
            Console.ReadKey();
        }       

        static void F1(string message)//2.声明一个符合委托类型签名的方法
        {
            Console.WriteLine($"打印:{message}");
        }        
    }
}

二.匿名方法

using System;

namespace DelegateTest
{
    public delegate void D1(string message);//1.声明一个委托类型
    internal class Program
    {
        static void Main(string[] args)
        {
            D1 d1 = delegate (string message)//声明一个委托类型的变量,指向一个匿名方法,匿名方法需要用到 delegate关键字,不用写方法名称
            {
                Console.WriteLine($"打印{message}");
            };
            Console.ReadKey();
        }    
    }
}

三.Lambda表达式替代匿名方法

using System;

namespace DelegateTest
{
    public delegate void D1(string message);//1.声明一个委托类型
    internal class Program
    {
        static void Main(string[] args)
        {
            D1 d1 = (string message) => //2.使用Lambda表达式替代匿名方法,不需要delegate关键字 用=>指向方法主体
            {
                Console.WriteLine($"打印{message}");
            };
            Console.ReadKey();
        }
    }
}

四.Action、Func

using System;

namespace DelegateTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Action<string> a1 = (string message) => //Action是C#内置的无返回值委托类型
            {
                Console.WriteLine($"打印{message}");
            };
            a1("这是无返回值委托");
            Func<int, int, int> f1 = (int j, int k) =>//Func是C#内置的有返回值的委托类型,最后一个泛型参数为返回值类型
            {
                return j + k;
            };
            Console.WriteLine($"打印{f1(4, 5)}");
        }
    }
}

五.Lambda表达式演变

using System;

namespace DelegateTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Func<int, int, int> f1 = (int j, int k) =>
            {
                return j + k;
            };
            Console.WriteLine($"打印{f1(4, 5)}");

            Func<int, int, int> f2 = (int j, int k) => j + k; //1.如果方法体内代码只有一行,可以不用写大括号
            Console.WriteLine($"打印{f2(4, 5)}");

            Func<int, int, int> f3 = (j, k) => j + k; //2.根据类型推断,可以不用写参数类型
            Console.WriteLine($"打印{f3(4, 5)}");

            Func<int, int> f4 = j => j; //3.参数只有一个,可以不用写括号
            Console.WriteLine($"打印{f4(4)}");
        }
    }     
}
C