现在的位置: 首页 > 综合 > 正文

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

2012年09月04日 ⁄ 综合 ⁄ 共 4395字 ⁄ 字号 评论关闭
文章目录

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

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

     NO1对象初始值设定项

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

               第一段代码:

1     class Person
2     {
3         public string name { getset; }
4         public string age { getset; }
5         public string sex { getset; }
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             [0class 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             [0class 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(objectnative 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     }

 

 

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

 

                           

抱歉!评论已关闭.