[C#]LambdaTest

本文深入探讨了C#中的Lambda表达式的不同形式及其应用场景,从.NET Framework 1.0到3.0的变化,以及如何利用Lambda表达式简化代码。同时介绍了Action和Func等泛型委托,并展示了Lambda表达式在实际开发中的灵活运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lambda学习

    public class LambdaTest
    {
        public delegate void NoReturnNoPara();
        public delegate void NoReturnWithPara(int id, string name);
        public delegate int WithReturnWithPara(int id, string name);

        public void Show()
        {
            int iNum = 100;
            {
                //.NetFramework1.0 1.1
                NoReturnWithPara method = new NoReturnWithPara(this.Study);
                method.Invoke(123, "ByBoy");
                this.Study(123, "ByBoy");
            }
            {
                //.NetFramework2.0 匿名函数,其实就是个方法,不用独立声明;共享变量
                NoReturnWithPara method = new NoReturnWithPara(delegate (int id, string name)
                {
                    Console.WriteLine(iNum);
                    Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发1!");
                });
                method.Invoke(234, "楠nan");
            }
            {
                //.NetFramework3.0  lambda表达式:参数列表 goes to  方法体
                NoReturnWithPara method = new NoReturnWithPara(
                    (int id, string name)
                    =>
                    {
                        Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发2!");
                    });
                method.Invoke(345, "ywa");
            }
            {
                //省略参数类型,语法糖,编译器自动推算,可以省略掉声明
                NoReturnWithPara method = new NoReturnWithPara(
                    (id, name)
                    =>
                    {
                        Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发3!");
                    });
                method.Invoke(456, "清池");
            }
            {
                //如果方法体只有一行 可以省略大括号和分号
                NoReturnWithPara method = new NoReturnWithPara(
                    (id, name) => Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发!4"));
                method.Invoke(456, "永远的油条");
            }
            {
                //实例化委托时,可以省略掉 new NoReturnWithPara(,  
                //也是编译器提供的便捷功能,是语法糖,编译后其实还是有这段代码的
                NoReturnWithPara method = (id, name) => Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发!5");
                method.Invoke(567, "风行天下");
            }
            //lambda表达式是什么?! 
            //lambda是代码的简化,其本质是个方法,而不是委托(类),也不是委托的实例,只是实例化委托的时的参数!
            //反编译查看,会为lambda生成类中类,密封+私有,里面多了几个方法,跟lambda一一对应,lambda也是个语法糖,编译后会起名字
            //lambda表达式注册多播委托是无法移除的!
            //很多复杂的lambda不会写,可以回去写方法!
            {
                NoReturnWithPara method = (i, s) => Console.WriteLine($"{i}-{s}跟着Eleven老师学习.Net高级开发!6");
            }

            {
                //下面我准备去花式使用lambda,有问题直接问
                //Action 框架提供  0到16个参数  没有返回值的 泛型委托
                Action action = () => { };//参数为空 就小括号
                Action<string> action1 = s => Console.WriteLine(s); //只有一个参数 可以去掉小括号
                Action<string, int> action2 = (s, i) => Console.WriteLine($"{i}-{s}跟着Eleven老师学习.Net高级开发!6");
                Action<string, int, DateTime, long, string, int, DateTime, long, string, int, DateTime, long, string, int, DateTime, long> action16 = null;
            }
            {
                //Func 框架提供  0到16个参数 带返回值的   泛型委托
                Func<int> func = () => DateTime.Now.Year;//如果方法体只有一行 需要去掉retrun
                Func<int, string> func1 = i => i.ToString();
                Func<int, string, DateTime> func2 = (i, s) => DateTime.Now;
                Func<string, int, DateTime, long, string, int, DateTime, long, string, int, DateTime, long, string, int, DateTime, long, decimal> func16 = null;
            }
            {
                //Action Func 都是.30出来,是为了统一委托的使用,以后只要用的到委托,都可以用。多线程Task.Run   Linq...
            }
            {
                //lambda表达式只能用在委托吗  
                //不是的  c#6 多了很多应用
                //表达式目录树,可以用lambda快速声明
                new List<int>().AsQueryable().Where(i => i > 3);
                Expression<Func<int, bool>> expression = i => i < 10;
            }

        }

        private void DoNothing()
        { }

        private void Study(int id, string name)
        {
            Console.WriteLine($"{id}-{name}跟着Eleven老师学习.Net高级开发!");
        }
        //起码是vs2015才能用
        public void SayHi() => Console.WriteLine(12345);
        public int Age => 3;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厦门德仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值