C#笔记——lambda表达式(委托->匿名方法->lambda表达式)
一、委托
1.基本知识
- 声明委托的方式:delegate 返回值类型 委托类型名(参数)
eg:delegate void StringProcess(string s);
注意:这里除了前面的delegate,剩下的部分和声明一个函数一样,但是StringProgress不是函数名,而是委托类型名。
- 声明的委托是一种类型,就像int,Person一样,如果要用的话还要声明委托类型的变量,声明委托类型变量的方式:StringProgress f1;
- 将委托变量指向函数SayHello。StringProgress sp = new StringProgress(SayHello),就可以像调用普通函数一样把sp当成函数用。即:委托类型实例化的对象是函数~! 委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托可以指向任意的函数,哪怕是之前没定义的都可以,而不受限于哪几种。为匿名函数铺垫~~
- 将委托类型变量指向函数还可以简化成StringProgress sp = SayHello,编译器帮我们进行了new,但是不能sp = Printit();这是调用函数,“执行Print函数,并且将sp指向PrintIt的返回值”
2.委托的组合
delegate void ProgressWordDelegate(string s)//一个ProgressWordDelegate委托
ProgressWordDelegate d = new ProgressWordDelegate(SayHello) + new ProgressWordDelegate(ToLower)
- 委托的组合必须是同一个类型
- 相当于创建了一个按照组合的顺序依次调用的新委托对象
- 委托的组合一般是给事件用的,用普通的委托的时候很少用
二、匿名方法
使用Delegate的时候很多时候没必要使用一个普通方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用匿名方法最合适。允许匿名对象就允许匿名方法。
1 ProcessWordDelegate p = delegate(string s) 2 { 3 Console.WriteLine(s); 4 };
委托类型名 f = delegate(参数列表) {};
其中f指向匿名函数,执行匿名函数的代码。
三、lambda表达式(与linq结合力量很强大perfect)
lambda表达式其实是匿名函数的另一种简化写法。常用于创建委托和表达式目录树类型。lambda表达式的标志运算符 => 读作“goesto”。
ProgressStringDelegate p = (s) => {Console.WrireLine(s);};
lambda语法详解:s为参数列表,不需要标注类型,因为变量声明中类型已经声明了;只输入一个参数时可以不用(),否则括号是必须的,多个参数中间用逗号隔开。=>后的{}中是方法体。lambda表达式返回方法体的结果。
通常Lambda表达式的参数都是可变类型的,由编译器自动确定它的具体类型。但有时编译器难于或无法推断输入类型,就需要为参数显示指定类型,即在参数之前添加参数类型。(int x,string s) =>s.Length>x
当Lambda表达式没有参数时,需要使用空括号表示,其中“()”表示没有参数,而Amethod()是一个具体的方法,该方法的返回值就是Lambda表达式的结果。 ()=>Amethod()