威尼斯人线上娱乐

深远理解C,Expression经验从前言

21 4月 , 2019  

对于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# 3.x和VB 九来讲,LINQ是最具魔力的。基本上许多的新的性子都以围绕着LINQ的得以落成来设计的。借助Extension
Method,我们得感到LINQ定义一名目大多的Operator。通过拉姆da Expression大家得认为LINQ编写越发简明的询问。大家能够说这么些新的性状成就了LINQ,也能够说这一个新特色便是为了落成LINQ而产生,可是大家应当明白,对于那一个新引进的本性,LINQ并非他们唯一的用武之地,在相似的编制程序中,大家也得以选取它们。

那三番五次串的小说首借使就落成职业和读书进程中的一些想想、难点的化解以及自觉风趣的意识等作些分享。

那壹类别的散文首假若就贯彻专门的职业和读书进度中的一些考虑、难题的消除以及自觉有意思的意识等作些分享。

继上一章,介绍Extension
Method从此以往,大家随后来介绍另一个首要的天性:Lambda
Expression。在前方的两篇文章中,作者屡屡在重申那样的贰个定义:C#
三.x新引进的那么些特征仅仅突显在Programming
Language和相应的Compiler层面。通过编写翻译生成的Assembly的IL和原先并从未本质的更动。从这一个意义上讲,全体的那个实际是编译器给我们玩得障眼法而已。拉姆da
Expression也不例外, Lambda
Expression正是三个Anonymous
Delegate,无论是Named
Delegate也好、Anonymous
Delegate也好,其本质也正是多少个Delegate。

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

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

接下去,作者将因而一个简便的德姆onstration,由浅入深地分析拉姆da
Expression,看看编写翻译器到底会编译生成什么样的附加的Code,他们的IL又是怎么样。

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

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

一、Named Delegate

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

在下边,作者说了Lambda Expression本质上就是2个Delegate,大家先不直接来介绍拉姆da
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")
OnPropertyChanged("Name")

地点的事例很简短,先定2个Generic Delegate :Function。在Program Class中定义3个Static的Function字段_namedMethodDelegate和与之相应的Method:SomeMethod,推断输入的数字是或不是高于零。在Main中实例化_namedMethodDelegate,并调用它。

优雅。并且更加多的益处是足以在编写翻译时检查错误,更加是在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_深远理解C,Expression经验从前言。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经验之一:合并LambdaExpression

Expression经验之一:合并LambdaExpression

二、  Anonymous
Method Delegate

Expression经验之二:LambdaExpression转变

Expression经验之二:拉姆daExpression转换

Anonymous Method是C# 贰.0引进的一个13分好用的效能。通过Anonymous
Method,大家得以Delegate的兑现直接以Inline的秘诀放入Delegate对象使用的岗位,而无须再繁琐地创造2个Delegate,并由此定义在有个别Class中装有一样评释的Method来事例化那些Delegate Instance,最终才将以此delegate instance传入需求调用的Method。

 

 

我们后天经过Anonymous Method来简化下边包车型客车代码。

威尼斯人线上娱乐 60威尼斯人线上娱乐 ,using 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是1律的。

接下去我们因而拉姆da 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 

 

后日大家能够得出结论了,拉姆da
Expression本质上是2个Anonymous Method
Delegate,那一个Delegate的无名性仅仅针对Programming
language来说,编写翻译器会为它生成三个Named
delegate和一个它指向的Method。这些多少个额外生成的对象作为利用Anonymous
Method Delegate对应的Class的Static Method而留存。从本质上讲和一般的Delegate并从未本质的界别。所以地点大家独家通过Named
delegate、Anonymous method
delegate和Lambda
Expression达成的2个主意是壹律的。

C# 三.x相关内容:
[原创]深远明白C#
叁.x的新特色(壹):Anonymous
Type
[原创]深切通晓C#
三.x的新特色(2):Extension Method – Part
I
[原创]深切驾驭C#
3.x的新特色(2):Extension Method – Part
II
[原创]深切掌握C# 三.x的新特色(三):从Delegate、Anonymous
Method到Lambda
Expression
[原创]深远掌握C# 叁.x的新特色(4):Automatically Implemented
Property
[原创]深远精通C# 三.x的新特色(5):Object Initializer 和 Collection
Initializer


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图