1、.Net Framework提供给我们灵活强大的数据操控能力。比如说,当我们需要对数据进行筛选的时候,我们想到的是“Where”子句,而不是List<T>.FindAll();当我们需要对数据进行排序的时候,我们想到的是“Order By”子句,而不是List<T>.Sort();当我们需要对数据进行分页的时候我们想到的是存储过程,而不是List<T>.GetRange()。
2、Lambda 表达式是一种匿名函数结构,它可以方便的实现委托、查询综合和扩展方法的 delegate 类型参数的初始化定义。
形式:
( 形参列表 ) => { 函数体 }
可以没有参数列表,如:() => { Console.WriteLine(""); }
3、扩展方法将一个在特定类型上实现的方法引入到该类型上,并可利用该类型直接调用。
例如,Count() 方法可以计算元素的个数,Count() 方法可以实现在 string、数组、集合、IEnumerable< T> 上,甚至是上文中定义的 Persons 类上。为了在 string 上实现 Count(),可以使用如下代码。using System.Runtime.CompilerServices;
public class Extensions{ [Extension()] public int Count(this string source) { int count = 0; foreach (var item in source) { count++; } return count; }
[Extension()] public int Count<T>(this IEnumerable<T> source) { int count = 0; foreach (var item in source) { count++; } return count; }}
这样,就在 IEnumerable<T> 上和 string 上都实现了Count()方法。我们可以象使用IEnumerable<T> 和 string 上的成员方法一样使用扩展方法,例如: string s = "Hello, World!"; int c1 = s.Count(); List< int> list = new List<int>() { 1, 2, 3, 4, 5, 6 }; int c2 = list.Count();
4、匿名类型常常用在查询表达式的结果中,因为这种类型的返回值往往是一个包含一种特定类型的 IEnumerable< T>。例如,要从上面的例子中选出年龄大于 21 岁,身高大于 160 厘米的 Person 集合,可以采用如下形式。
var result = from person in persons where person.Age >= 21 && person.Height >= 160 select new { Name = person.Name, Age = person.Age, Height = person.Height / 100 }; new { Name = person.Name, Age = person.Age, Height = person.Height / 100 } 是一个匿名类型,编译器将对它做如下声明。 public class _Anonymous_Name_Age_Height { public string Name; public string Age; public decimal Height; }
5、委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。