又是一个周末,刚好有时间,又继续复习与总结了,希望能让大家受益,不足之处欢迎指正,谢谢!
十八. Lambda
1.Lambda表达式:匿名方法的另一种表现形式,它可以包含表达式和语句,且用于创建委托或转换为表达式树,定义语法:(形参列表)=>{方法体}; 单个参数时,可以省略括号
2.Lambda表达式树是用来表示Lambda表达式逻辑的一种数据结构,它将代码表示成一个对象树,而非可执行的代码,定义语法如(a+b):
Experssion<Func<int,int,int>> (a,b)=>a+b;
通过代码动态构造Lambda表达式树,如下:
1
2
3
4
5
6
7
|
parameterExpression a=Expression.Parameter(
typeof
(
int
),”a”);
parameterExpression a=Expression.Parameter(
typeof
(
int
),”b”);
BinaryExpression body=Expression.Add(a,b);
Experssion<Func<
int
,
int
,
int
>> exprTree=Expression.Lambad(body,a,b);
|
3.Lambda表达式树通过调用Compile方法将表达式树转换为可执行代码(即所表示的委托)
十九.扩展方法
1.扩展方法是一种方法,它用来扩展已知类型的方法成员(即在不改变原有类型的前提下,附加新的方法);
2.扩展方法定义规则:
a)必须在一个非嵌套、非泛型的静态类(即标准的静态类)中定义;
b)它至少要有一个参数;
c)第一个参数必须在类型加上this关键字,表示向该参数对应的类型就进扩展;
d)第一个参数不能使用任何修饰符(如:不能使用rel,out)
e)第一个参数的类型不能是指针类型;
3.扩展方法定义语法如下:
1
2
3
4
5
6
7
|
static
class
静态类名
{
public
static
返回类型 扩展方法名(
this
目标扩展类型 形参名,其它形参…)
{
//方法体
}
}
|
4.空引用(NULL)支持调用扩展方法
注意:定义扩展方法时,为防止方法污污染(即扩展的方法在某些类型中并无实际作用或不需要),应尽量扩展具体类型,而不要扩展其基类
二十.LINQ
1.LINQ,即语言集成查询,提供一种跨越各种数据源的统一的查询方式
2.LINQ查询表达式必须以from子句开头,并且必须以select或group子句结尾,在第一个from子句与最后一个select或group子句之间可以包含多个子包,定义语法如下:
Var query=from n in numbers where n<=10 select n;
3.LINQ查询表达式是建立在Lambda表达式和扩展方法的基础上的,而Lambda表达式又是建立在委托的基础上的,扩展方法也属于方法,所以LINQ的本质还是对方法的调用,对于编译器而言,使用LINQ查询表达式与使用方法调用的代码完全相同。
二十一.C#4.0新特性
可选参数:指定了默认值的参数,即在调用方法时,该参数可以指定实参,也可以不指定实参,若不指定则采用默认值;
注意:1.可选参数必须在非可选参数的后面;2.默认值必须为常量;3.不定参数(即用params表示的参数数组)不能为可选参数;4.用rel或out标识的参数不能为可选参数;
命名实参:即在调用方法时,直接指定形参名并为其赋值(指定实参),可不按方法形参的顺序,且非可选参数必需全部指定实参,使用语法如下:
1
2
3
4
5
6
7
8
|
static
void
Write(DateTime dt,
string
name,
string
result=
"www.zuowenjun.cn"
)
{
Console.Write(
"{0}-{1}-{2}"
, dt, name, result);
}
//调用方法
Write(name:
"梦在旅途"
, dt: DateTime.Now);
|
动态类型:即用dynamic关键字来表示某个变量的类型,动态类型可不用编写显式强制转换的代码,强制转换由编译器来完成;定义语法如下:
dynamic d=10;dynamic str=”www.zuowenjun.cn”; dynamic p=new People();
注意:1.不能直接用动态类型作为实参来调用扩展方法;2.委托与动态类型间不能做隐式转换;3.不能调用构造函数或静态方法;4.不能将动态类型dynamic作为基类声明,也不能作为泛型类型参数的约束
二十二.多线程
1.线程与进程关系:线程是进程的执行单元,操作系统通过调度线程来使应用程序工作,而进程则是线程的容器,它是由操作系统创建,又在具体的执行过程中创建了线程;一个进程至少包含一个线程。
2.线程分前台线程与后台线程之分,在同一个线程中,若所有前台线程结束后,CLR会强制强结束仍在运行的所有后台线程,这些后台线程被直接终止,却不会抛出任何异常。主线程一定是前台线程。线程的创建语法如下:
Thread 线程变量名=new Thread(委托实例);
线程变量名.IsBackgroud=true; //为true则表示为后台线程,否则为前台前线程
线程变量名.Start();//启动线程
3.线程池:是指存放应用程序中要使用的线程的集合,若要使用线程池中的线程,需要调用静态方法:ThreadPool.QueueUserWorkItem
4.线程同步:确保某一时间只有一个线程在操作共享资源,实现线程同步的方法:
a)监视器Monitor、lock,使用代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private
static
object
syncObj =
new
object
();
//类的静态字段
try
{
Monitor.Enter(syncObj);
//其它代码
}
finally
{
Monitor.Exit(syncObj);
}
lock
(syncObj)
//为上面代码的简写形式
{
//执行代码
};
|
b)Mutex对象,Mutex是跨进程的,因此我们可以在同一台机器甚至远程的机器上的多个进程上使用同一个互斥体,使用代码如下:
1
2
3
4
|
Mutex mt=
new
Mutex();
mt.WaitOne();
//等待
//执行代码
mt.ReleaseMutex();
//释放
|
c) ReaderWriterLock类型,用ReaderWriterLock进行资源访问时,如果在某一时刻资源并没有获取写的独占权,那么可以获得多个读的访问权,单个写入的独占权,如果某一时刻已经获取了写入的独占权,那么其它读取的访问权必须进行等待,使用语法如下:
1
2
3
4
|
static
ReaderWriterLock rwLock =
new
ReaderWriterLock();
//类的静态字段
rwLock.AcquireWriterLock(1000);
//执行代码
rwLock.ReleaseWriterLock();
|
d)还有SynchronizationAttribute、MethodImplAttribute、同步事件和等待句柄等,具体每种用法可参见该篇博文:
http://www.cnblogs.com/michaelxu/archive/2008/09/20/1293716.html
本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/4470829.html ,如需转载请自行联系原作者