您的位置:首页 > 编程语言 > C#

LINQ学习之旅——准备(C#3.0新特性补充)

2011-08-29 14:15 281 查看
  今天主要是对上一节所说的C#3.0的新特性做些补充:对象及集合初始化表达式、匿名类型、局部方法以及查询表达式。这些特性在LINQ中使用也很频繁,尤其是查询表达式。

  1.对象初始化表达式允许开发者在一条语句中给一个对象的一个或多个域或属性进行初始化赋值。这是在C#3.0之后新添加的特性,在这之前只能对C#基本类型或数组进行初始化赋值。示例如下:

(1)自定义类(点和圆):

View Code

staticvoid Main(string[] args)
{
PartialClass pc =new PartialClass();

Console.Read();
}


(3)结果:



不仅局部方法的定义和实现可以分开,甚至只有方法的定义没有方法的实现也可以。只不过在这种情况下,编译器在编译局部代码时不会产生任何IL(中间代码)代码,就像方法不存在一样。把上述代码中的局部方法实现部分去掉:

//局部类
publicpartialclass PartialClass
{
//定义局部方法
partialvoid partialMethod();

public PartialClass()
{
partialMethod();//调用局部方法
}

}


就不会产生任何的输出结果。局部方法被Linq To SQL作为一种轻量级事件来处理。在Linq To SQL自动生成的实体类中,每一个与数据库中字段相对应的属性值在修改之前会自动调用局部方法,在修改之后又会调用另一个局部方法。作为开发人员可以自己定义这两个局部方法的实现代码,当然也可以不定义实现部分,这本质上类似于一种事件处理机制。现对局部方法总结如下:(1)局部方法只能定义和实现在局部类中;(2)局部方法需用关键字partial来修饰;(3)局部方法是私有的,但不能用private来修饰;(4)局部方法的返回值必须为void;(5)局部方法可以没有实现部分;(6)局部方法可以是静态的;(7)局部方法可以有参数;

  5.最后来说说查询表达式,它也是LINQ使许多开发人员爱不释手的原因之一。并且查询表达式包括许多之前讲到过的C#3.0语言新的特性。示例如下:

staticvoid Main(string[] args)
{
var Sprites =new[]{
new {Profession="法师",Weapon="魔杖",Blood=200},
new {Profession="战士",Weapon="屠龙刀",Blood=1000},
new {Profession="导师",Weapon="倚天剑",Blood=500}
};

//查询表达式:查找血量大于300的精灵职业,且按血量的升序排列
var query = from s in Sprites
where s.Blood >300
orderby s.Blood
select new { Profession = s.Profession };

foreach (var s in query)
{
Console.WriteLine("血量大于300的精灵职业:{0}", s.Profession);
}

Console.Read();
}


结果:



查询表达式以from关键字开始,以select或group关键字结束,from关键字后操作的对象必须实现IEnumerable<T>接口的类的实例。上述的查询表达式还可以写成这样:

var query = Sprites
.Where(s => s.Blood >300)
.OrderBy(s => s.Blood)
.Select(s =>new { Profession = s.Profession });


前者通过编译器翻译后生成上述这样等价的语句,所以查询表达式包括Lamdba表达式、扩展方法(如:Where和OrderBy方法)、对象初始化表达式、匿名类型和局部类型推断var等。因为查询表达式是LINQ技术中是最常用的,所这些C#3.0的新特性是LINQ技术底层实现的基础。因此掌握了这些C#语言特性在之后进一步学习LINQ就会显得轻松许多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: