程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#基礎加強篇---委托、Lamada表達式和事件(中),

C#基礎加強篇---委托、Lamada表達式和事件(中),

編輯:C#入門知識

C#基礎加強篇---委托、Lamada表達式和事件(中),


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語句。

 

 

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved