技术开发 频道

C#3.0初体验


  注意extension方法的优先度比instance方法低。因此如果instance方法和extension方法有同样的签名,则应执行instance方法。
  3.对象初始化器

  在C# 2.0中,开发者认为建立许多构造器来设定某个属性值为对象初始化过程。下面是一个例子: 类访问Customer方法:
Customer myCustomer = new Customer("Zach", "Smith");
  Customer类构造器:
public Customer(string firstName, string lastName) : this() {  this.FirstName = firstName;  this.LastName = lastName; } public Customer() {}
  C# 3.0介绍了一个初始化对象的新方法,它允许您在初始化对象时设定任何属性值。例如,在C# 3.0中,上面的代码块可以写成:

  类访问Customer方法:
Customer myCustomer = new Customer{FirstName = "Zach", LastName = "Smith" };   Customer类构造器: public Customer() {}
  在C# 3.0代码中,没有与初始化对象对应的构造器。这样,开发者就不用为每组需要设定的属性建立不同的构造器。

  这样产生的另外一个效果是:代码变得更容易阅读了。例如,虽然我们清楚知道下面的代码对一个Car对象进行了初始化,但我们并不清楚其中变量的作用:
Car car = new Car(18, 10, 550);
  一眼看来,下面这行代码更易阅读,尽管我们必须输入更多代码:
Car car = new Car { WheelDiameter = 18, WheelWidth = 10, Horsepower = 550 };
  4.匿名类型

  C# 2.0引入了匿名方法,C# 3.0推出匿名类型。匿名类型与匿名方法类似,它们都是以嵌入方式建立,并没有正式的名称。在建立一个匿名类型,您必须组合上述对象初始化器和隐型局部变量两个概念。下面是一个匿名类型的例子:
varmyType = new { Length = 79, Width = 30 };
  匿名类型的范围与任何其它变量的范围相同。例如,下面代码块中的cobra实例仅仅在Speed函数块中有效:
private void Speed() {  var cobra = new { Horsepower = 550, Torque = 570 }; }
  如果一个匿名类型被初始化而另一个匿名类型位于范围域中,并且它们的签名相同,第二个类型将自己占用第一个类型的类型。例如,在下面这段代码中,cobra和mustang都是匿名类型,并且可以彼此设定。
private void Speed() {  var cobra = new { Horsepower = 550, Torque = 570 };  var mustang = new { Horsepower = 300, Torque = 300 };  mustang = cobra; //or you could say cobra = mustang }

  5 .LINQ

  在之前的C#版中,开发者应用许多不同的查询语言来访问不同的数据源。例如,要查询一个XML文件,开发者会使用 XPath,要查询一个SQL数据库,开发者将使用SQL。在过去这种方法十分有效,并且现在仍然是访问各种数据的主要方法。但是,这种方法具有一些缺点。 一个显著的缺点在于:开发者必须以一种不同的语言,而非他们当前使用的语言(如SQL或XPath)来编写查询代码。另一个缺点是,在执行某些查询语言,如SQL时,开发者必须编写映射代码将查询结果转化为可用的C#业务对象。

  C#3.0推出一种称之为语言集成查询(LINQ)的新方法。应用LINQ,开发者可以编写出能够搜索任何IEnumerable<T>数据源的代码。所以除了应用TSQL访问MS SQL数据库,应用XPath访问XML文件外,他们还可以应用LINQ。

  下面的代码(列表C)是一个LINQ查询的例子,它返回所有OrderCount大于10的顾客:

  列表C

using System; using System.Query; using System.Collections.Generic; public class SampleClass {  static void Main()  {   List<Customer> customers = GetCustomers();   //Write our query to retrieve customers who have more than   // 10 orders.   IEnumerable<Customer> queryResult = from customer in customers   where customer.OrderCount > 10   orderbycustomer.ID   select customer;  } }

  与SQL或XPath不同,LINQ查询用C#,而非第三方语言编写。这样,查询就不会出现类型问题,开发者也就没有必要编写映射代码把查询返回的数据转化成C#对象,而由LINQ API自动处理映射。

  基本上,在ORM解决方案中,LINQ对象用途很大。同样,它的范围也非常广泛,有大量MSDM信息描述了它的功能。

 

0
相关文章