1.lambada:
任何 Lambda 表达式都可以转换为委托类型。 Lambda 表达式可以转换的委托类型由其参数和返回值的类型定义。 如果 lambda 表达式不返回值,则可以将其转换为 Action 委托类型之一;否则,可将其转换为 Func 委托类型之一。注意的是,委托并不关心类,只关心关联方法的参数和返回值类型是否一致。
2.属性与lambada:
当一个属性 string demoString=>“One String”;
就会把return \”One String\”作为demoString的get访问器,并且不设置set访问器。
2.闭包:
闭包的定义,如果一个方法块,使用的外部变量,
Func1(){
int a;
Func2(){
a=3
}
}
这样使用的话,a就会从局部变量,变成长久存在的变量,这样的操作是要注意回收内存资源。C#中支持闭包的手段是lambda 表达式
如:
class Program {static void Main(string[] args) {List<Func<int>> funcsList = new List<Func<int>>();for (int i = 0; i < 3; i++){funcsList.Add(() =>{return i;});}foreach (var item in funcsList){Console.WriteLine(item().ToString());}}}
打印的结果为3,3,3。
分析:
在for循环中,i最后一次的值为3.正常来说i在for循环结束,就应该被回收,可是foreach中还调用了funcList委托链,就会把for循环中的i保留下来,并在第二次调用的时候,使用。
如果在for中加入一个int temp 并且func委托返回的是temp的值的话。
class Program {
static void Main(string[] args) {List<Func<int>> funcsList = new List<Func<int>>();for (int i = 0; i < 3; i++){int temp = i;funcsList.Add(() =>{return temp;});}foreach (var item in funcsList){Console.WriteLine(item().ToString());}}
}
打印的结果为0,1,2
分析:
第一次循环,for循环都会创建一个新的temp,当lambda对其进行捕获的时候,第一次捕获的temp0为0,第二次捕获的temp1为1,第三次捕获的temp2为2
因为是三个不同的变量,所以打印的结果为0,1,2。
C#中对于闭包的描述比较合理的是:把对象视为与数据关联的一组方法,并把闭包是为与一个函数关联的一组数据。
闭包的存在对于数据的使用提供了一种思路,单纯只是对象.数据的形式有时候会让问题变得冗长。
class Program {static void Main(string[] args) {Action act1 = Demo();act1();}static Action Demo() {string messageArg = \"测试\";Action act =() => { Console.WriteLine(messageArg); };return act;}}
像是这个messageArg应该是在Demo被调用结束后就应该销毁,如果是单纯的面向对象要保存这个messAge就要创建相关的类和变量。