Lambda表达式的演变

1 lambda的演变

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MyDelegate
{
    public delegate void NoReturnNoParameter();  // 1 声明委托
    public delegate void NoReturnWithParameter(string name, int age);  // 1 声明委托

    public class DelegateStudy
    {
        public void Show()
        {

            //lambda演变历史
            // .NetFramework 1.0 时代
            {
                NoReturnWithParameter method = new NoReturnWithParameter(this.DoEverything);
                method.Invoke("张三", 19);
            }
            {
                // .NetFramework 2.0 匿名方法.delegate 关键字
                // 可以访问局部变量
                NoReturnWithParameter method = new NoReturnWithParameter(delegate(string name, int age)
                {
                    Console.WriteLine(name);
                    Console.WriteLine(age);
                });
                method.Invoke("李四", 20);
            }
            {
                // .NetFramework 3.0  去掉delegate 增加了一个 =>
                // lambda 表达式  参数列表=>方法体
                NoReturnWithParameter method = new NoReturnWithParameter( (string name, int age)=>
                {
                    Console.WriteLine(name);
                    Console.WriteLine(age);
                });
                method.Invoke("李四", 20);
                // 也可以这样
                Action<string,int> action = new Action<string, int>((string name, int age) =>
                {
                    Console.WriteLine(name);
                    Console.WriteLine(age);
                });
                action.Invoke("王五", 40);
            }
            {
                // LambdaExpression 可以省略参数类型 这是编译器的语法糖
                // 虽然没写 但编译时还是有的  类型是根据委托推算的
                Action<string, int> action = new Action<string, int>(( name,  age) =>
                {
                    Console.WriteLine(name);
                    Console.WriteLine(age);
                });
                action.Invoke("王五", 40);
            }
            {
                // lambda 当方法体只有一行时,可以去掉大括号  
                Action<string, int> action = new Action<string, int>((name, age) => Console.WriteLine(name + "我的年纪是" + age)
                );
                action.Invoke("王五", 40);
            }
            {
                // 当参数只有1个时 可以省掉括号
                Action<string> action = new Action<string>(name=>Console.WriteLine(name));
                // 还可以 
                Action<string> action2 = name => Console.WriteLine(name);//这是语法糖
            }
        }
        public void DoSomething()
        {
            Console.WriteLine("DoSomething");
        }
        public void DoEverything(string name, int age)
        {
            Console.WriteLine(name);
            Console.WriteLine(age);
        }
        public void DoAction(Action action)
        {
            action.Invoke();
        }

    }
}

2 lambda表达式的本质

        lambda表达式只是实例化委托的一个参数,就是个方法

        表面上看是匿名方法,但是在编译时会自动分配一个方法名,还会增加一个私有的密封类,而这个方法就在密封类内。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值