菜鸟学习lambda(一)(C#.Net)

     自己没有做过什么大项目只能去读别人的代码,不读不知道一读吓一跳。差距蹭蹭地拉开。自己属于比较毛躁的人,看什么也看不进去。整天混天度日,在公司里上QQ混校内。偶尔发现自己也老大不小了。又在大家对程序员前途的描述下决定痛改前非好好学习。

     回家戴上耳机听先听首歌鼓励一下自己,我听得是火影忍者的 萤之光 对照着翻译仔细听一下很有感觉(我很仇日,不过他们确实很励志,师夷长技以制夷)。翻开刚买的书想"翻到哪页看那页",俺地娘来Linq。开始吧不牢骚了。

     NO1对象初始值设定项

               什么东东啊?不管了,照着例子写代码。

               第一段代码:

1       class  Person
2      {
3           public   string  name {  get set ; }
4           public   string  age {  get set ; }
5           public   string  sex {  get set ; }
6      }

 

                               首先定义了一个类:Person,也就是人类啦。人类就有个名字了,你年龄了,性别了(没有这三项的人类不在托管堆受控)

                               这三个应该叫:Person的属性。就是人类的特征性质了。

                               然后再看下面的代码

代码
1        static   void  Main( string [] args)
2          {
3              Person pers = new  Person
4              {
5                     name  =   " Lee " ,
6                      age  =   " 22 " ,
7                      sex  =   " boy " ,
8              };
9          }

 

                                     咦,整啥呢这是?记得以前实例化一个对象应该是

 

 

  class  Program
     {
        
static   void  Main( string [] args)
         {
             Person pers 
=   new  Person();
             pers.name 
=   " Lee " ;
             pers.age 
=   " 22 " ;
             pers.sex 
=   " boy " ;
            
          }
   }

 

                                     靠,潜水这么多论坛怎么也会反编译吧,尽管看不懂IL。。。。、

                                       IL:

代码
 1 
 2    .method   private   hidebysig  static  void  Main( string [] args)  cil   managed
 3      {
 4           .entrypoint
 5           .maxstack   2
 6           .locals   init  (
 7              [ 0 class  lamda.Person <>g__initLocal0)
 8           L_0000:   newobj   instance   void  lamda.Person::.ctor()
 9           L_0005:   stloc.0  
10           L_0006:   ldloc.0  
11           L_0007:   ldstr   " Lee "
12           L_000c:   callvirt   instance   void  lamda.Person::set_name( string )
13           L_0011:   ldloc.0  
14           L_0012:   ldstr   " 22 "
15           L_0017:   callvirt   instance   void  lamda.Person::set_age( string )
16           L_001c:   ldloc.0  
17           L_001d:   ldstr   " boy "
18           L_0022:   callvirt   instance   void  lamda.Person::set_sex( string )
19           L_0027:   ret  
20      }

                     IL代码都一样啊,就是换了个写法啊原来。突然想起我高中化学老师的话:记住就行,遇到了就这么做。哦知道了。

                           NO2匿名方法

                           看到这想起李建中老师的视频讲座(抓紧翻出来回顾一下)。

                           先看一段比较熟悉的委托,记得余晖说过也叫代理吧(委托与事件)。

 

代码
 1  namespace  lamda
 2  {
 3       class  Program
 4      {
 5           delegate   string  mydelegate( string  name);
 6            static   void  Main( string [] args)
 7           {
 8               mydelegate del  =  Person.PersonEat;
 9               Console.WriteLine(del( " apple " ));
10               Console.ReadLine();
11           }
12      }
13       public   class  Person
14      {
15           public   static   string  PersonEat( string  food)
16          {
17               return   " I eat  "   +  food;
18          }
19      }
20 
21  }

 

 

如果突然间看到下面这段代码估计觉得这是java吗?c#没见这么写啊。

 

代码
 1  class  Program
 2      {
 3           delegate   string  mydelegate( string  name);
 4            static   void  Main( string [] args)
 5           {
 6                mydelegate del  =  ( string  food)  =>  {  return   " I eat  "   +  food; };
 7               Console.WriteLine(del( " apple " ));
 8               Console.ReadLine();
 9           }
10      }

 本想故技重施看IL,木然发现看不懂了。丢人ing。发现结果一样只不过省了个方法写在一行上了。

  string  food就是原先那个委托所代理的方法中的参数列表。右侧呢直接就是方法里的代码块。方法的名字没有了省略了。匿名了,,,

发现自己现在也就是能把一个lambda表达式还原回代理方法这么一个简单的阶段,也许还没有。

代码
 1       .method   private   hidebysig  static  void  Main( string [] args)  cil   managed
 2      {
 3           .entrypoint
 4           .maxstack   3
 5           .locals   init  (
 6              [ 0 class  lamda.Program/mydelegate del)
 7            L_0000:   ldsfld   class  lamda.Program/mydelegate lamda.Program::CS$<>9__CachedAnonymousMethodDelegate1
 8           L_0005:   brtrue.s  L_0018
 9           L_0007:   ldnull  
10           L_0008:   ldftn   string  lamda.Program::<Main>b__0( string )
11 
12           L_000e:   newobj   instance   void  lamda.Program/mydelegate::.ctor( object native  int)
13 
14           L_0013:   stsfld   class  lamda.Program/mydelegate lamda.Program::CS$<>9__CachedAnonymousMethodDelegate1
15           L_0018:   ldsfld   class  lamda.Program/mydelegate lamda.Program::CS$<>9__CachedAnonymousMethodDelegate1
16 
17           L_001d:   stloc.0  
18           L_001e:   ldloc.0  
19           L_001f:   ldstr   " apple "
20           L_0024:   callvirt   instance   string  lamda.Program/mydelegate::Invoke( string )
21           L_0029:   call   void  [mscorlib]System.Console::WriteLine( string )
22           L_002e:   call   string  [mscorlib]System.Console::ReadLine()
23           L_0033:   pop  
24           L_0034:   ret  
25      }

 

 

                           哎,写不下去了,自己水平差太多。只是自己理解皮毛。加倍努力。

 

                           

你可能感兴趣的:(lambda)