1.声明式编程风格
声明式(Declarative)编程特性体现为告诉计算机“Do What”,而不是“How to do”
LINQ就是声明式编程的典型例子,如果将它与标准的面向对象编程做个比较,就清楚这两者的不同了
假设现在有一个Student对象集合保存了一批学生的信息:
class student
{
public string Name { get; set; }
public string City { get; set; }
}
需要按City属性进行分组
先定义一个数据结构用于保存数据分组
class StudentGroup
{
public string City;
public List<Student> Students = new List<Student>();
}
编写与下方法完成整个数据处理工作
static void GroupStudentByCity()
{
var students = getStudents();
var results = new List<StudentGroup>();
foreach (var student in students)
{
StudentGroup res = results.Find(
item=>item.City==student.City);
if (res!=null)
{
res.Students.Add(student);
}
else
{
StudentGroup newRes = new StudentGroup() { City=student.City};
newRes.Students.Add(student);
results.Add(newRes);
}
}
}
上述代码清晰的告诉计算机:第一步做什么,第二部做什么.....拥有一个明确的执行流程,并且我们可以从代码中清楚的看到整个数据的处理逻辑
以下为LINQ的处理版本
static void GroupStudentsByCityUseLINQ()
{
var results = from student in GetStudents()
group student by student.City into grp
select ProcessGroup(grp);
PrintResult(results);
}
可以看到,使用LINQ编程,只需要告诉计算机我们“要什么”,而让计算机自己去决定具体的步骤
2.动态性编程特性
所谓动态性(Dynamic),其实就是将一些原本在编译时完成的工作推迟到程序运行时才能进行
使用动态语言编程的好处就是灵活,开发效率高
.Net4.0以前,CLR是针对静态编程语言(如C#)而设计的,无法直接运用Ruby和Python等动态语言开发程序
.Net4.0引入了一个"动态语言运行时(Dynamic Language Runtime,DLR)",在CLR之上提供了一个动态语言的运行环境,从而允许Ruby等动态语言编写的程序在.Net平台上运行
比如C# 4.0就引入了一个新的dynamic关键字用于定义动态类型检查的变量,由此可以写出
dynamic d=1;
dynamic result=d.DoSomething();
Console.WriteLine(result);
变量d保存的是一个整数,默认情况下,他不可能有一个DoSomething()方法,然而上述代码可以顺利的通过编译,直到运行时才报告引发了一个RuntimeBinderException异常。这说明C#编译器看到dynamic类型的变量时,他不去检查变量的真实类型,"d.DoSomething()"这个表达式的类型推断推迟到程序运行时。
3.支持并行程序开发
随着计算机进入多核时代,编写支持多核并行的软件成为潮流。
在.Net 4.0中,引人注目地添加的一个"并行扩展(Parallel Extension)",它为所有的.Net编程提供了一个开发并行程序的平台。在编程语言层面,主要体现为将传统的LINQ增强为支持并行功能的"并行LINQ",由于LINQ本身可与编程语言无缝隙集成,这相当于“间接地”给.Net编程语言扩展了开发并行程序的能力。
将LINQ转换为PLINQ非常简单,很多情况下只需添加一个新的AsParallel()子句即可
var results = from student in GetStudents().AsParallel()
group student by student.City into grp
select ProcessGroup(grp);
PrintResult(results);
上述代码在多核CPU上运行时,会自动划分为多个子工作任务并行执行。其中关键的一点是这些代码并不假设一定会在多核CPU上运行,也不假设CPU执行核的个数,一切都是透明的,用户将会发现这些代码在多核CPU上执行会得到更好的性能,但是在单核的CPU上也能得到正确的结果。