参考:https://www.cnblogs.com/hehehehehe/p/6043710.html
https://www.cnblogs.com/miro/p/5006520.html
//System.Text.RegularExpressions命名空间 //该名称空间包括8个类,1个枚举,1个委托。他们分别是: //Capture: 包含一次匹配的结果; //CaptureCollection: Capture的序列; //Group: 一次组记录的结果,由Capture继承而来; //GroupCollection:表示捕获组的集合 //Match: 一次表达式的匹配结果,由Group继承而来; //MatchCollection: Match的一个序列; //MatchEvaluator: 执行替换操作时使用的委托; //RegexCompilationInfo:提供编译器用于将正则表达式编译为独立程序集的信息 //RegexOptions 提供用于设置正则表达式的枚举值 //Regex类中还包含一些静态的方法: //Escape: 对字符串中的regex中的转义符进行转义; //IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值; //Match: 返回Match的实例; //Matches: 返回一系列的Match的方法; //Replace: 用替换字符串替换匹配的表达式; //Split: 返回一系列由表达式决定的字符串; //Unescape:不对字符串中的转义字符转义。
引子
为方便说明,先举个例子,列出Lambda表达式的一个典型形式:
x=>x+1
大家可以看到,Lambda表达式的语法由三部分组成,分别为:
1. Lambda运算符 => 读作goes to;
2. 左边参数部分 x ;
3. 右边的Lambda主体
可以看出,其实所谓的Lambda表达式(lambda expression)就是一个匿名函数,或者说是匿名函数的简单形式。而匿名函数的作用就是分配给委托类型的。
假设我们声明一个委托:
lambada 表达式(匿名函数)用来填充委托变量:
Mydel del= x=>x+1;
我们就从这个例子说开去。
演化过程
刚刚说过,lambda表达式就是匿名方法的简写形式,说到lambda表达式就要说到匿名方法,而匿名方法就是初始化委托时内联声明的方法。
因此我们先从委托说起,一直推导出 lambda表达式Mydel del=x=>x+1; 的形式。
和类相似,委托是用户自定义的引用类型。
类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。
可以将委托类比为类,创建和使用的过程如下:
1.声明类型
2.声明类型的变量
3.填充变量
4.使用变量
对应着四步的完整例子:
delegate int Mydel(int x);
Mydel del;
del=new Mydel(xxx方法); //也可以直接用简化写法 del=xxx方法;
del(2);
以上第三步中初始化委托使用 xxx方法 。
如果方法专门用来初始化委托,只会被使用一次,这种情况下,除了创建委托的语法需要,没有必要创建独立的具名方法,这样就引出了匿名方法。
匿名方法是在初始化委托时内联声明的方法,非匿名方法的例子如下:
public static int Add1(int x)
{
return x+1 ;
}
delegate int MyDel(int x);
调用:
MyDel del=Add1;
del(2);
改造成用匿名方法的完整例子:
delegte int MyDel(int x);
调用:
MyDel del=delegate(int x) { return x+1;}
del(2);
从例子中提取出匿名方法的语法:
delegate(Parameters) { ImplementationCode }
几个注意点:
1. 返回值:不显示声明返回值,与委托相同
2. 参数
以下情况可以使用圆括号为空或省略圆括号来简化参数列表。
a. 不包括任何out 参数 b. 不使用任何参数
满足上面两个条件即可省略参数列表,例子:
delegate int SomeDel();
SomeDel sDel = delegate { return 1; };
3.params 参数
如果委托声明的参数列表包含了 params 参数(可变数目参数),匿名方法的参数列表将忽略params关键字
delegate void SomeDel(int x, params int[] y);
SomeDel sDel = delegate(int x, int[] y) { … }
匿名方法准备好了,我们稍加变化,就可以得出Lambda表达式
以 MyDel del=delegate(int x) { return x+1;} 为例。
转换步骤:
1.删除delegate关键字,在参数列表和匿名方法主体之间放 =>
MyDel del = (int x) => {return x+1; } ;
可以进一步简化
2. 去掉参数类型
MyDel del2 = (x) => {return x+1; } ;
说明:
编译器可以从委托声明中知道委托参数的类型,因此可以省略类型。
带有类型的参数列表称为显式类型。
省略类型的参数列表称为隐式类型。
3.去掉参数刮号
MyDel del3 = x => {return x+1; } ;
说明:
如果只有一个隐式类型参数,可以省略刮号。
4.去掉主体的大刮号及return
MyDel del4 = x=> x+1;
说明:
Lambda表达式允许表达式的主体是语句块或表达式。
如果语句块包含一个返回语句,可以将语句块替换成return 后面的表达式。
这样就得到我们文章开头的形式。
总结
C#2.0引入了匿名方法,C#3.0引入了lambda表达式,可以看到,lambda表达式简化了匿名函数的使用,让代码更加简洁。