x的新特征,Expression资历早前言

对于C#中的Expression性格想必从事C#付出的同班都不会不熟悉,英特网和田园里都有众多的好的篇章介绍。笔者想也从未必要再去写一些随笔去介绍,科学普及或是从入门到明白之类的。

较从前三个本子,对于C# 3.x和VB 9来讲,LINQ是最具吸重力的。基本上超多的新的特色都以环绕着LINQ的兑现来两全的。依据Extension Method,大家可感觉LINQ定义生机勃勃层层的Operator。通过Lambda Expression大家得以为LINQ编写特别简洁的查询。大家能够说这么些新的特征成就了LINQ,也得以说那几个新天性正是为着达成LINQ而发出,可是我们应当知道,对于这一个新引进的特色,LINQ并不是他们唯意气风发的发挥专长,在经常的编制程序中,大家也可以动用它们。

那连续串的小说首如若就完结职业和读书进度中的一些心想、难题的缓慢解决以致自觉好玩的意识等作些分享。

继上生机勃勃章,介绍Extension Method后来,大家跟着来介绍另一个十分重要的特征:Lambda Expression。在后面包车型地铁两篇文章中,我屡次在重申那样的贰个概念:C# 3.x新引入的这么些特色仅仅体今后Programming Language和呼应的Compiler层面。通过编写翻译生成的Assembly的IL和原先并不曾精气神的改换。从这一个含义上讲,全部的这么些其实是编写翻译器给大家玩得障眼法而已。Lambda Expression也不例外, 拉姆da Expression就是多少个Anonymous Delegate,无论是Named Delegate也好、Anonymous Delegate也好,其本质相当于一个Delegate。

依据于Expression, 大家得以写些相当高贵(最少个人感觉卡塔尔国的代码。

接下去,作者将透过三个简便的德姆onstration,由浅入深地深入分析Lambda Expression,看看编写翻译器到底会编写翻译生成什么样的附加的Code,他们的IL又是如何。

例于开垦WPF的同窗们每一天要接触的ViewModel中,

一、Named Delegate

OnPropertyChanged(() => Name);

在上头,我说了兰姆da Expression本质上正是一个Delegate,我们先不直接来介绍Lambda Expression, 大家先来探视我们最棒熟知的Delegate的例子: 

要比

图片 1using System;
图片 2using System.Collections.Generic;
图片 3using System.Linq;
图片 4using System.Text;
图片 5
图片 6namespace Artech.LambdaExpression
图片 7图片 8图片 9{
图片 10    class Program
图片 11图片 12    图片 13{
图片 14        static void Main()
图片 15图片 16        图片 17{
图片 18            _namedMethodDelegate = new Function<int, bool>(SomeMethod);
图片 19            Function<int, bool> function1 = _namedMethodDelegate;
图片 20            function1(20);     
图片 21
图片 22        }
图片 23        private static Function<int, bool> _namedMethodDelegate;
图片 24
图片 25        private static bool SomeMethod(int args)
图片 26图片 27        图片 28{
图片 29            return (args > 0);
图片 30        }
图片 31
图片 32    }
图片 33
图片 34    delegate TResult Function<TArgs, TResult>(TArgs args);
图片 35
图片 36}

OnPropertyChanged("Name")

上边的例证相当粗略,先定多少个Generic Delegate :Function。在Program Class中定义叁个Static的Function字段_namedMethodDelegate和与之相应的Method:SomeMethod,推断输入的数字是不是高于零。在Main中实例化_namedMethodDelegate,并调用它。

大雅。并且越来越多的裨益是能够在编写翻译时检查错误,非常是在Property名字被改成后。

大家通过IL Disassembler这些Utility来拜会Main方法的IL代码。为了让对IL Instruction不是很驾驭的读者越来越轻松地领略整个推行进程,小编加了简便易行注释。对于那多少个愿意特别询问全数MSIL Instruction列表的读者,可以参见:MSIL Instruction Table。

 

图片 37.method private hidebysig static void  Main() cil managed
图片 38图片 39图片 40{
图片 41  .entrypoint
图片 42  // Code size       34 (0x22)
图片 43  .maxstack  3
图片 44  .locals init ([0] class Artech.LambdaExpression.Function`2<int32,bool> function1)//Initialize function1
图片 45  IL_0000:  nop
图片 46  IL_0001:  ldnull
图片 47  IL_0002:  ldftn      bool Artech.LambdaExpression.Program::SomeMethod(int32)//Pushes the method pointer referenced by SomeMethod. 
图片 48  IL_0008:  newobj     instance void class Artech.LambdaExpression.Function`2<int32,bool>::.ctor(object,
图片 49                                                                                                 native int)//Initializer a Artech.LambdaExpression.Function delegate instance.
图片 50  IL_000d:  stsfld     class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::_namedMethodDelegate//Stores a static field: _namedMethodDelegate
图片 51  IL_0012:  ldsfld     class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::_namedMethodDelegate//Pushes the static field(_namedMethodDelegate)  of an object Static .
图片 52  IL_0017:  stloc.0   //Pop the first local variable 
图片 53  IL_0018:  ldloc.0   //Pushes the first local variable 
图片 54  IL_0019:  ldc.i4.s   20 //Pushes specified 8-bit value (20) as 32-bit 
图片 55  IL_001b:  callvirt   instance !1 class Artech.LambdaExpression.Function`2<int32,bool>::Invoke(!0)//Calls virtual method of delegate instance. 
图片 56  IL_0020:  pop
图片 57  IL_0021:  ret
图片 58} // end of method Program::Main
图片 59

好了,对Expression的礼赞就相当少说了。以下是自家想享受的阅历:

对于Delegate,小编无须再作深切的牵线,相信大家已经心中有数。在这处需求入眼建议是,上边介绍的剧情将是再而三部分的底子,通过前面包车型地铁对Anonymous Method和Lambda expression介绍,你会发觉它们生成的代码结议和方面包车型客车是这几个相符的。

Expression经验之生机勃勃:合并LambdaExpression

二、  Anonymous Method Delegate

Expression经验之二:LambdaExpression转换

Anonymous Method是C# 2.0引进的三个充裕好用的功力。通过Anonymous Method,大家得以Delegate的完结直接以Inline的方式归入Delegate对象使用之处,而无须再繁杂地创制一个Delegate,并透过定义在有些Class中有所相通表明的Method来事例化那个Delegate Instance,最终才将以此delegate instance传入必要调用的Method。

 

我们现在通过Anonymous Method来简化下边包车型地铁代码。

图片 60using System;
图片 61using System.Collections.Generic;
图片 62using System.Linq;
图片 63using System.Text;
图片 64
图片 65namespace Artech.LambdaExpression
图片 66图片 67图片 68{
图片 69    class Program
图片 70图片 71    图片 72{
图片 73        static void Main()
图片 74图片 75        图片 76{
图片 77            Function<int, bool> function2 = delegate(int args)
图片 78图片 79            图片 80{
图片 81                return args > 0;
图片 82            };
图片 83            function2(20);   
图片 84        }
图片 85    }
图片 86    delegate TResult Function<TArgs, TResult>(TArgs args);
图片 87}
图片 88

我们经过Reflector剖判编写翻译生成的Assembly,大家开掘它抱有下边包车型客车组织。进一层解析Program Class,大家开采它多了四个附加的Static成员:<>9__CachedAnonymousMethodDelegate1和<Main>b__0。那是编写翻译器的佳绩。

图片 89

上面分别是<>9__CachedAnonymousMethodDelegate1和<Main>b__0的定义:

图片 90[CompilerGenerated]

图片 91private static Function<int, bool> <>9__CachedAnonymousMethodDelegate1;

图片 92[CompilerGenerated]

图片 93private static bool <Main>b__0(int args)

图片 94图片 95图片 96{

图片 97    return (args > 0);

图片 98}

图片 99

是还是不是笔者大家地点大器晚成节定义的_namedMethodDelegate和SomeMethod这么些七个静态成员风流浪漫致?  

大家进一层分析Main Method的IL。

图片 100.method private hidebysig static void  Main() cil managed
图片 101图片 102图片 103{
图片 104  .entrypoint
图片 105  // Code size       43 (0x2b)
图片 106  .maxstack  3
图片 107  .locals init ([0] class Artech.LambdaExpression.Function`2<int32,bool> function2)
图片 108  IL_0000:  nop
图片 109  IL_0001:  ldsfld     class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::'<>9__CachedAnonymousMethodDelegate1'
图片 110  IL_0006:  brtrue.s   IL_001b
图片 111  IL_0008:  ldnull
图片 112  IL_0009:  ldftn      bool Artech.LambdaExpression.Program::'<Main>b__0'(int32)
图片 113  IL_000f:  newobj     instance void class Artech.LambdaExpression.Function`2<int32,bool>::.ctor(object,
图片 114                                                                                                 native int)
图片 115  IL_0014:  stsfld     class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::'<>9__CachedAnonymousMethodDelegate1'
图片 116  IL_0019:  br.s       IL_001b
图片 117  IL_001b:  ldsfld     class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::'<>9__CachedAnonymousMethodDelegate1'
图片 118  IL_0020:  stloc.0
图片 119  IL_0021:  ldloc.0
图片 120  IL_0022:  ldc.i4.s   20
图片 121  IL_0024:  callvirt   instance !1 class Artech.LambdaExpression.Function`2<int32,bool>::Invoke(!0)
图片 122  IL_0029:  pop
图片 123  IL_002a:  ret
图片 124} // end of method Program::Main
图片 125

和大家地方焕发青新年的IL比较,是或不是出奇地常常。所用大家能够说,我们在第四节中Named Delegate和Anonymous Method Delegate是同样的。

接下去我们透过Lambda Expression达成地方的机能。

三、 Lambda Expression

下边是经过Lambda Expression达成地点相像作用的Code:

图片 126using System;
图片 127using System.Collections.Generic;
图片 128using System.Linq;
图片 129using System.Text;
图片 130
图片 131namespace Artech.LambdaExpression
图片 132图片 133图片 134{
图片 135    class Program
图片 136图片 137    图片 138{
图片 139        static void Main()
图片 140图片 141        图片 142{
图片 143            Function<int, bool> function3 = x => x > 0;
图片 144            function3(20);
图片 145        }
图片 146    }
图片 147
图片 148    delegate TResult Function<TArgs, TResult>(TArgs args);
图片 149
图片 150}
图片 151

笔者们透过Reflector深入分析编写翻译生成的Assembly,我们发掘它和因而Anonymous Method Delegate落成的完全等同:Program Class,大家发现它多了五个附加的Static成员,它们的称谓都统统相通:<>9__CachedAnonymousMethodDelegate1和<Main>b__0。

图片 152

这两个Static Member:<>9__CachedAnonymousMethodDelegate1和<Main>b__0的概念也于大家经过Anonymous Method Delegate达成时如出一辙:

图片 153[CompilerGenerated]

图片 154private static Function<int, bool> <>9__CachedAnonymousMethodDelegate1;

图片 155

图片 156[CompilerGenerated]

图片 157private static bool <Main>b__0(int args)

图片 158图片 159图片 160{

图片 161    return (args > 0);

图片 162}

图片 163

大家特别来会见Main Method的IL。  

图片 164.method private hidebysig static void  Main() cil managed
图片 165图片 166图片 167{
图片 168  .entrypoint
图片 169  // Code size       43 (0x2b)
图片 170  .maxstack  3
图片 171  .locals init ([0] class Artech.LambdaExpression.Function`2<int32,bool> function3)
图片 172  IL_0000:  nop
图片 173  IL_0001:  ldsfld     class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::'<>9__CachedAnonymousMethodDelegate1'
图片 174  IL_0006:  brtrue.s   IL_001b
图片 175  IL_0008:  ldnull
图片 176  IL_0009:  ldftn      bool Artech.LambdaExpression.Program::'<Main>b__0'(int32)
图片 177  IL_000f:  newobj     instance void class Artech.LambdaExpression.Function`2<int32,bool>::.ctor(object,
图片 178                                                                                                 native int)
图片 179  IL_0014:  stsfld     class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::'<>9__CachedAnonymousMethodDelegate1'
图片 180  IL_0019:  br.s       IL_001b
图片 181  IL_001b:  ldsfld     class Artech.LambdaExpression.Function`2<int32,bool> Artech.LambdaExpression.Program::'<>9__CachedAnonymousMethodDelegate1'
图片 182  IL_0020:  stloc.0
图片 183  IL_0021:  ldloc.0
图片 184  IL_0022:  ldc.i4.s   20
图片 185  IL_0024:  callvirt   instance !1 class Artech.LambdaExpression.Function`2<int32,bool>::Invoke(!0)
图片 186  IL_0029:  pop
图片 187  IL_002a:  ret
图片 188} // end of method Program::Main
图片 189

和地点通过

Anonymous Method Delegate完结的时候完全部是后生可畏致的。

四、Conclusion 

 

几日前大家得以得出结论了,Lambda Expression本质上是四个Anonymous Method Delegate,这些Delegate的佚名性仅仅针对Programming language来说,编写翻译器会为它生成三个Named delegate和一个它指向的Method。那一个五个额外生成的靶子作为利用Anonymous Method Delegate对应的Class的Static Method而留存。从实质上讲和平常的Delegate并不曾精气神的区分。所以地点大家独家通过Named delegate、Anonymous method delegate和Lambda Expression达成的3个点子是同等的。

C# 3.x相关内容:
[原创]深切明白C# 3.x的新脾气(1卡塔尔国:Anonymous Type
[原创]深切驾驭C# 3.x的新本性(2卡塔尔国:Extension Method - Part I
[原创]深远明白C# 3.x的新脾气(2卡塔 尔(英语:State of Qatar):Extension Method - Part II
[原创]深切明白C# 3.x的新特色(3卡塔尔:从Delegate、Anonymous Method到Lambda Expression
[原创]深远掌握C# 3.x的新特色(4卡塔 尔(阿拉伯语:قطر‎:Automatically Implemented Property
[原创]深远驾驭C# 3.x的新特征(5卡塔尔国:Object Initializer 和 Collection Initializer

本文由星彩网app下载发布于计算机编程,转载请注明出处:x的新特征,Expression资历早前言

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。