一、正则表达式的用途
1、 UBB翻译
2、 敏感词过滤
(1) 获取用户输入
(2)用StringBuilder添加需要审核的关键字
StringBuilder sbMod = new StringBuilder ();
sbMod.Append ()
(3)验证是否包含禁止发帖的关键字
二、委托
(一)委托是一种数据类型,像类一样。通过delegate关键字定义委托。
委托(delegate)可以认为是这样的对象,它包含具有相同
由委托保存的方法可以来自任何类或结构,只要它们同时匹配委托的如下两点:
1、返回值
2、签名(包括ref和out修饰符)
调用列表中的方法可以是实例方法或是静态方法。
delegate和struct、class是同一级别的
(二)定义一个委托:
1、 使用delegate关键字
2、 如果这个委托要存储的方法如果没有返回值,那么委托要定义成void。如果没有参赛,将来传递的方法也不能有参数。
3、 委托是一个数据类型,用的时候需要传递一个变量。
public delegate void MethodDelegate ();
Main()
{
Classc1 = new Class();
c1.Test(M1);
//第一种写法:声明委托变量myMethod,将M2方法赋值给MyMethod变量
//这是一个简写,其实编译器完成了MethodDelegatemyMethod = new MethodDelegate ()。使用快捷语法是因为在方法名称和其对应的委托类型之间有隐式转换。
MethodDelegatemyMethod = m2;
}
4、一般在调用委托前,都要判断一下委托变量是否为null
(三)委托的作用,在某段代码内部,嵌入一段外部代码。相当于:注入
窗体回传值用委托。
例题分析:两个ConsoleApplication,一个要实现将时间在ConsoleApplication中显示,另一个要实现将时间写入文件Time.txt。共同要实现WriteTime()方法,只是ConsoleApplication1具体方法是WriteToCmd(),ConsoleApplication2具体方法是WriteToFile()。可以建一个类库实现WriteTime()方法,并将其定义为一个delegate类型(在此案例中是WriteTimeToDevDelegate)的引用,而WriteToCmd和WriteToFile即为WriteTime的两个实例化对象。
案例一:
Main()
{
Class1 c1;
string[] names = {“”,””}
c1.ChangeString(names); //变大写
}
ChangeStringToUpper(string msg)
{
}
ChangeStringAddStars(string msg)
{
}
建一个类库ChangeString
Class1
{
ChangeString(string[]str,)
{
for(int i = 0;…..)
{
//委托只是把方法中变的地方提取出来
str[i] = ChgStr(str[i]);
}
}
}
案例二:选出最大整数
1、 添加类库ClsMaxLib
Class1中GetMax(int[] arr)方法
GetMaxString(strinig[] _names)
GetMaxPerson(Person[] pers,xxx BiJiaoFangShi)
{
for()
{
if(BiJiaoFangShi(max,objs[i]))
{
max=objs[1];
}
}
}
Public Object GetMaxOBject(object[] objs)
2、 Main()中
(1)年龄最大
int arrAge = {30,90,78,24,56};
Class1 c1;
c1.GetMax(arrAge)
(2)名字最长
string[] names…;
c1.GetMaxString(names)
(3)求最大的人
Person[] pers = new ……;
c1.GetMaxPerson(pers)
3、 CompareDelegate(定义在类库ClsMaxLib中)
作业P134
三、匿名方法
(一)如果方法只会被使用一次——用来初始化委托,在这种情况下,没有必要创建独立的具名方法。可以用匿名方法。
匿名方法(anonymous method)是在初始化委托时内联(inline)声明的方法。
(二)使用匿名方法
1、在如下地方使用:
1) 声明委托变量时作为初始化表达式
2) 组合委托时在赋值语句的右边
3) 为委托增加事件时在赋值语句的右边。
2、 匿名方法的语法
表达式包含如下组成部分:
(1) delegate类型关键字
(2) 参数列表,没有使用任何参数则省略
(3) 语句块,包含了匿名方法的代码
delegate (Parameters) {ImplementationCode}
l 参数
除了数组参数,匿名方法的参数列表必须在三方面匹配委托:
A. 参数数量
B. 参数类型
C. 修饰符
l 捕获
在匿名方法中的外部变量称为被方法捕获(captured),只要捕获方法还是委托的一部分,即使变量已经离开了作用域,被捕获的外部变量也一直有效。
(三)Lambda表达式
lambda其实就是一个匿名函数,编译时会将lambda表达式编译成一个C#匿名函数。使用lambda表达式可以减少代码量。
MyDel del = delegate(int x) {return x+1}; // 匿名方法
MyDel le1 = (int x) => {return x+1}; // Lambda表达式(显式类型)
MyDel le2 = x =>{return x+1}; // Lambda表达式(隐式类型)
Mydel le3 = x => x+1 ; // 最简Lambda表达式
l 有关lambda表达式参数列表的要点:
1、 lambda表达式参数列表中的参数必须在参数数量、类型和位置上与委托相匹配
2、 表达式的参数列表中的参数不一定要包含类型(如隐式类型),除非委托有ref或out参数——此时类型是必须的(如显式类型)
3、 如果只有一个参数,并且是隐式类型的,周围的圆括号可以被省略,否则它就是必须的。
4、 如果没有参数,必须使用一组空的圆括号。