【亚洲必赢官网】x的新特征,Expression经验以前言

对于C#中的Expression个性想必从事C#支出的同校都不会不熟悉,网上和田园里都有成都百货上千的好的篇章介绍。笔者想也远非须求再去写一些稿子去介绍,科学普及或是从入门到掌握之类的。

Expression经验在此之前言,Expression经验

对于C#中的Expression个性想必从事C#支付的同室都不会面生,网上和田园里都有为数不少的好的篇章介绍。作者想也大可不必再去写一些稿子去介绍,科学普及或是从入门到理解之类的。

那三番五次串的小说主倘使就兑现工作和上学进程中的壹些考虑、难点的消除以及自觉有意思的发现等作些分享。

借助于Expression, 我们得以写些很优雅(至少个人认为)的代码。

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

OnPropertyChanged(() => Name);

要比

OnPropertyChanged("Name")

大雅。并且越多的好处是足以在编译时检查错误,特别是在Property名字被改成后。

 

好了,对Expression的夸赞就不多说了。以下是自家想分享的阅历:

Expression经验之壹:合并拉姆daExpression

Expression经验之2:LambdaExpression转换

Expression经验之三:拉姆daExpression作缓存key

 

对于C#中的Expression性情想必从事C#付出的同室都不会素不相识,网上和田园里都有广大的好的篇章介绍。小编想…

对于C#中的Expression个性想必从事C#付出的同学都不会素不相识,网上和田园里都有不少的好的文章介绍。我想也绝非须求再去写一些篇章去介绍,科普或是从入门到领悟之类的。

较在此以前八个版本,对于C# 三.x和VB 玖来讲,LINQ是最具吸重力的。基本上繁多的新的天性都是环绕着LINQ的落到实处来设计的。借助Extension
Method,大家可以为LINQ定义1多级的Operator。通过拉姆da Expression我们得以为LINQ编写特别从简的查询。我们可以说这一个新的特征成就了LINQ,也得以说这么些新特征便是为着达成LINQ而发出,可是大家应当清楚,对于这个新引进的特色,LINQ并非他们唯一的用武之地,在一般的编制程序中,大家也能够使用它们。

那类别的小说主若是就落到实处工作和读书进程中的1些想想、难题的消除以及自觉有意思的觉察等作些分享。

那连串的小说主若是就贯彻工学进程中的壹些盘算、难题的化解以及自觉有意思的发现等作些分享。

继上1章,介绍Extension
Method之后,我们跟着来介绍另3个根本的特征:Lambda
Expression。在前面包车型客车两篇文章中,我再3在重申那样的五个概念:C#
三.x新引进的这几个特点仅仅呈未来Programming
Language和对应的Compiler层面。通过编写翻译生成的Assembly的IL和原来并未实质的改造。从这些意思上讲,全体的这一个实际上是编写翻译器给大家玩得障眼法而已。拉姆da
Expression也不例外, Lambda
Expression就是3个Anonymous
Delegate,无论是Named
Delegate也好、Anonymous
Delegate也好,其本质也正是三个Delegate。

借助于Expression, 大家能够写些很优雅(至少个人认为)的代码。

借助于Expression, 我们能够写些很优雅(至少个人以为)的代码。

接下去,作者将因而二个简练的德姆onstration,安份守己地分析Lambda
Expression,看看编写翻译器到底会编写翻译生成怎样的附加的Code,他们的IL又是怎么。

例于开辟WPF的同桌们天天要接触的ViewModel中,

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

一、Named Delegate

OnPropertyChanged(() => Name);
OnPropertyChanged(() => Name);

在下面,小编说了拉姆da Expression本质上正是一个Delegate,大家先不直接来介绍Lambda
Expression, 大家先来看看大家Infiniti纯熟的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")
OnPropertyChanged("Name")

上边的例子很简短,先定七个Generic Delegate :Function。在Program Class中定义1个Static的Function字段_namedMethodDelegate和与之对应的Method:SomeMethod,推断输入的数字是还是不是超过零。在Main中实例化_namedMethodDelegate,并调用它。

【亚洲必赢官网】x的新特征,Expression经验以前言。大雅。并且越多的裨益是能够在编写翻译时检查错误,越发是在Property名字被转移后。

大雅。并且更加多的收益是足以在编写翻译时检查错误,尤其是在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的夸赞就不多说了。以下是本人想享受的经验:

好了,对Expression的赞颂就不多说了。以下是自家想分享的经历:

对于Delegate,笔者无须再作深切的牵线,相信我们早就了如指掌。在这边须求重点建议是,上面介绍的始末将是后续部分的基本功,通过后边的对Anonymous
Method和Lambda expression介绍,你会发现它们生成的代码结构和地点的是相当相似的。

Expression经验之1:合并拉姆daExpression

Expression经验之一:合并LambdaExpression

二、  Anonymous
Method Delegate

Expression经验之二:LambdaExpression转换

Expression经验之二:LambdaExpression转变

Anonymous Method是C# 2.0引进的3个不胜好用的效率。通过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

是否本身我们地方1节定义的_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比较,是还是不是出奇地1般。所用大家能够说,我们在第二节中Named
Delegate和Anonymous Method
Delegate是同样的。

接下去我们由此Lambda Expression达成地点的作用。

三、 Lambda
Expression

上面是透过拉姆da 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来讲,编写翻译器会为它生成2个Named
delegate和多少个它指向的Method。这些七个额外生成的目的作为利用Anonymous
Method Delegate对应的Class的Static Method而留存。从实质上讲和一般的Delegate并未精神的界别。所以地点大家分别通过Named
delegate、Anonymous method
delegate和Lambda
Expression达成的一个措施是千篇壹律的。

C# 3.x相关内容:
[原创]浓厚精通C#
三.x的新天性(壹):Anonymous
Type
[原创]长远掌握C#
3.x的新特点(二):Extension Method – Part
I
[原创]深深驾驭C#
叁.x的新特点(二):Extension Method – Part
II
[原创]深深掌握C# 三.x的新特点(3):从Delegate、Anonymous
Method到拉姆da
Expression
[原创]深深驾驭C# 三.x的新特点(4):Automatically Implemented
Property
[原创]深深领会C# 三.x的新特点(伍):Object Initializer 和 Collection
Initializer

网站地图xml地图