关于Lambda表达式

  Lambda表达式是C#3.0的一种新语法,语法简洁

  为编写匿名方法提供了更简明的函数式的句法.

  我通过一个示例来说明Lambda表达式的原理:

  Lambda表达式和匿名方法都来源于委托

  我们来看看委托的使用

  在C#1.0时:

 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Text;
 5
 6namespace ConsoleApplication3
 7{
 8    public delegate int Calculate(int a, int b);
 9    class Program
10    {
11
12        static void Main(string[] args)
13        {
14            int a = 3;
15            int b = 4;
16           Calculate result = new Calculate(Add);
17            Console.WriteLine(result(a,b));
18            Console.Read();
19        }
20
21        public static int Add(int a, int b)
22        {
23            return a + b;
24        }
25    }
26}
27

  C#2.0时可以使用匿名方法:

 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Text;
 5
 6namespace ConsoleApplication3
 7{
 8    public delegate int Calculate(int a, int b);
 9    class Program
10    {
11
12        static void Main(string[] args)
13        {
14            int a = 3;
15            int b = 4;
16            Calculate result = delegate(int ta, int tb) { return ta + tb; };
17
18            Console.WriteLine(result(a,b));
19            Console.Read();
20        }
21
22    }
23}
24

  C#3.0使用Lambda表达式:

 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Text;
 5
 6namespace ConsoleApplication3
 7{
 8    public delegate int Calculate(int a, int b);
 9    class Program
10    {
11
12        static void Main(string[] args)
13        {
14            int a = 3;
15            int b = 4;
16            Calculate result = (ta, tb) => ta + tb;
17            Console.WriteLine(result(a,b));
18            Console.Read();
19        }
20
21    }
22}
23

 

  使用Lambda表达式更简洁,为什么那么简洁.其实是编译器为我们做了很多事情.

 Calculate result = (ta, tb) => ta + tb;

  这句话 编译器在编译的时候 会为我们生成一个私有的静态方法.透过ILDASM可以看到它是怎么帮助我们的,

关于Lambda表达式

  。 

  编译器为我们声明声明了一个私有静态的Calculate委托字段 和一个静态的私有方法.

  通过IL代码可以看看Main方法内部是怎么实现的

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       58 (0x3a)
  .maxstack  3
  .locals init ([0] int32 a,
           [1] int32 b,
           [2] class ConsoleApplication3.Calculate result)
  IL_0000:  nop
  IL_0001:  ldc.i4.3
  IL_0002:  stloc.0
  IL_0003:  ldc.i4.4
  IL_0004:  stloc.1
  IL_0005:  ldsfld     class ConsoleApplication3.Calculate ConsoleApplication3.Program::'CS$<>9__CachedAnonymousMethodDelegate1'
  IL_000a:  brtrue.s   IL_001f
  IL_000c:  ldnull
  IL_000d:  ldftn      int32 ConsoleApplication3.Program::'b__0'(int32,
                                                                       int32)
  IL_0013:  newobj     instance void ConsoleApplication3.Calculate::.ctor(object,
                                                                          native int)
  IL_0018:  stsfld     class ConsoleApplication3.Calculate ConsoleApplication3.Program::'CS$<>9__CachedAnonymousMethodDelegate1'
  IL_001d:  br.s       IL_001f
  IL_001f:  ldsfld     class ConsoleApplication3.Calculate ConsoleApplication3.Program::'CS$<>9__CachedAnonymousMethodDelegate1'
  IL_0024:  stloc.2
  IL_0025:  ldloc.2
  IL_0026:  ldloc.0
  IL_0027:  ldloc.1
  IL_0028:  callvirt   instance int32 ConsoleApplication3.Calculate::Invoke(int32,
                                                                            int32)
  IL_002d:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0032:  nop
  IL_0033:  call       int32 [mscorlib]System.Console::Read()
  IL_0038:  pop
  IL_0039:  ret
} // end of method Program::Main

 

  可以看出IL_0005: 到IL_001f 这段代码是初始化编译器为我们生成的委托

  下面几行IL指令可以看出来是为我们初始化委托

IL_000c: ldnull     //声明一个空的函数指针

IL_000d: ldftn   //加载方法指针 指向 'b__0'(int32,int32) 函数

IL_0013: newobj //实例化委托

IL_0018: stsfld //保存

  透过IL代码 我们看到了Lambda表达式的的正真实现方法….

  看到了C#语言没有什么改变 只是编译器为我们完成了很多东西

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

烈火蜓蜻

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

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

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

打赏作者

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

抵扣说明:

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

余额充值