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语句。
有点玩了,先睡觉,事件留到下篇吧。。。。晚安