C#基礎加強篇---委託、Lamada運算式和事件(中)

來源:互聯網
上載者:User

標籤:

2.Lamada運算式

    C#共有兩種匿名函數:匿名方法和Lamada運算式。在2.0之前的C#版本中,建立委託的唯一方法是使用命名方法。C#2.0中引入了匿名方法,匿名方法就是沒有名稱的方法。從C#3.0開始,就可以使用一種新文法把實現代碼賦予委託——Lamada運算式。

      在瞭解Lamada運算式之前,我們先來瞭解一下匿名方法。用匿名方法定義委託的文法與之前的沒有區別,但在執行個體化時就有了一些區別。

      使用命名方法建立的委託

 1  class Program 2     { 3         private delegate void DelSayHi(string name);//定義委託 4         static void Main(string[] args) 5         { 6             Test("張三", SayHelloByChinese); 7             Test("Zhang San", SayHelloByEnglish); 8         } 9         static void Test(string name, DelSayHi del)10         {11             del(name);12         }13         static void SayHelloByEnglish(string name)14         {15             Console.WriteLine("Hello ," + name);16         }17         static void SayHelloByChinese(string name)18         {19             Console.WriteLine("你好," + name);20         }21     }


      使用匿名方法建立的委託

 1   class Program 2     { 3         private delegate void DelSayHi(string name);//定義委託 4         static void Main(string[] args) 5         { 6             Test("張三", delegate(string name) 7             { 8                 Console.WriteLine("你好," + name); 9             });10             Test("Zhangsan", delegate(string name)11             {12                 Console.WriteLine("Hello," + name);13             });    14         }15         static void Test(string name, DelSayHi del)16         {17             del(name);18         }  19     }

      匿名方法的優點是減少了代碼的編寫,不必定義僅由委託調用的方法。使用匿名方法時,編譯器仍定義了一個方法,該方法只有一個自動指定的名稱,我們不需要知道。使用匿名方法時,我們應遵循兩條規則:一是在匿名方法中不能使用跳躍陳述式(break,goto或continue)跳到該匿名方法的外部,反之,匿名方法外部的跳躍陳述式不能跳到匿名方法的內部。二是在匿名方法內部不能訪問不安全的代碼,也不能訪問在匿名方法外部使用的ref和out參數,但可以在匿名方法中使用外部定義的其他變數。

 

     好了,我們再來瞭解Lamada運算式。。。。

     若要建立 Lambda 運算式,需要在 Lambda 運算子=>左側指定輸入參數(如果有),然後在另一側輸入運算式或語句塊。

     樣本1:

 1  class Program 2     { 3         delegate int del(int i); 4         static void Main(string[] args) 5         { 6             del myDelegate = x => x * x; 7             int j = myDelegate(5); //j = 25 8             Console.WriteLine(j.ToString()); 9         }10     }

     樣本2:

nam

     樣本3:

 1  static void Main(string[] args) 2         { 3             string mid = ",middle part,"; 4  5             Func<string, string> lamada = (string param) =>   6             { 7                 param += mid; 8                 param += " end of string."; 9                 return param;10             };11             Console.WriteLine(lamada("Start of string "));12         }

    為了簡便,樣本2和3中name和param的類型string也可以省略不寫。只有一個參數,只用寫出參數名就行了。如果委託使用多個參數,就把參數名放在括弧裡。
            string mid = ",middle part,";

            Func<string,string, string> lamada = (start,end) => 
            {
                start += mid;
                end =start+end;
                return end;
            };
            Console.WriteLine(lamada("Start of string "," end of string."));

     還有如果Lamada運算式只有一條語句,在方法塊內就不需要花括弧和return語句,此時編譯器會添加一條隱式的return語句。如樣本1,它相當於  del myDelegate = x =>{ return x * x; };如果在Lamada運算式的實現代碼中有多條語句,就必須添加花括弧和return語句。

 

 

    有點玩了,先睡覺,事件留到下篇吧。。。。晚安

C#基礎加強篇---委託、Lamada運算式和事件(中)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.