7. 扩展方法
扩展方法就是给一个既有的类添加新的方法,这在以前是不可思议的事情,在C#3.0里却是很简单:
public static class MethodsExtentions
{
public static double Distance(this Point pointA, point pointB)
{
return Math(Sqrt(Math.Pow(pointA.X – pointB.X, 2) + Math.Pow(pointA.Y – pointB.Y, 2));
}
}
现在这个Distance方法就附加到Point类上了,记住这个方法必须是静态的,它的类也必须是静态的,被附加的类是其第一个参数,而且前面必须加上关键字this,后面的参数就成为扩展方法的参数。使用的时候Distance()方法可以直接当作Point的实例方法来使用:
Point ptA = new Point(3, 4);
Point ptB = new Point(5, 6);
double distance = ptA.Distance(ptB);
Console.WriteLine(distance);
8. 分部方法
C#2.0支持分部类,即把一个类的定义放在多个文件中,每个类使用partial关键字修饰。现在C#3.0在分部类的基础上支持分部方法,即在一个分部类中声明方法,在另外一个分部类中实现这个方法。
对于分部方法,限制较多:
- a. 分部方法使用partial修饰,且返回类型必须是void
- b. 分部方法可以有ref参数,但不能有out参数
- c. 分部方法是隐式私有的(private),因而不能是虚方法(virtual)
- d. 分部方法不能是外部的(extern)
- e. 分部方法可以有static和unsafe修饰符
- f. 分部方法可以是泛型的。
- g. 可以把已经定义且实现了的分部方法创建为委托,但对仅定义的分部方法则不可以。
9. LINQ
LINQ是一种新的编程模型,它通过在.NET语言中直接集成查询支持来实现对数据的访问,简单地说就是在C#3.0中用类似于SQL查询语句的写法来查询数据,从而节省许多代码,提高生产力。数据源可以是对象、DataSet、SQL、XML等,如下图所示:
(1). LINQ to Objects
即从任何IEnumerable或者IEnumerable集合中直接查询数据。比如从一个人名组成的数组中查找所有以“G”开头的人,那么可以这样写代码:
string[] allNames = {"Jeffrey", "Kirby", "Gabriel", "Philip", "Ross", "Adam", "Alston", "Warren", "Garfield"};
IEnumerable foundNames = from name in allNames
where name.StartsWith("G")
select name;
看起来和SELECT语句有点像,但是有点奇怪,但是它至少不用我们写循环遍历这个数组了。上面的LINQ语句返回的是一个IEnumerable集合,利用隐式类型,可以再简化一点代码:
var foundNames = from name in allNames
where name.StartsWith("G")
select name;
对得到的结果可以用foreach输出:
foreach (string name in foundNames)
{
Console.WriteLine(name);
}
稍微复杂一点儿的LINQ例子:
var foundNames = from name in allNames
where name.StartsWith("G") || name.Contains("by")
orderby name
select name;
看起来更像SELECT语句了。
(2)LINQ to DataSet(略)
(3) LINQ to SQL(略)