標籤:
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運算式和事件(中)