深入理解C# 3.0的五项主要改进

2016-02-19 14:10 2 1 收藏

下面这个深入理解C# 3.0的五项主要改进教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】


     推荐:Visual C# 轻松入门全攻略

  1.隐型局部变量

  C# 3.0引入了一个叫做“var”的新关键字。这个关键字允许开发者建立一个变量,但不必明确它的类型。例如,用var说明一个字符串,就像这样:

varmyData = "This is my data";
  注意,这里并没有提到myData变量是一个字符串,而C# 2.0却要求这一点。

  虽然var允许您建立隐含的类型,它并没有降低C#浓厚的类型特征。var关键字只有在建立变量时有用,一旦您建立变量并且确定它的类型以后,就不能再用var来改变一个变量的类型。

  例如,这段代码没有作用:

varmyDate = DateTime.Now;
myDate = "Hello.";
  使用var关键字还会产生一个有趣的结果,它可以帮助开发者减少建立变量时的代码输入。例如,在C# 2.0中建立一个Customer对象,需要输入以下代码:

Customer myCustomer = new Customer();
  使用新的var关键字,则只要输入:

varmyCustomer = new Customer();

  var关键字的另一个特点在于,使用它可以避免改变一个返回某个类型对象的方法调用。例如,在C# 2.0中,如果您需要调用一个返回Customer对象的方法,您应该编写以下代码:

Customer myCustomer = GetByName("Zach");
  如果某个时候GetByName方法返回一个不是Customer的对象,这段代码就无法编译。但是,如果应用var关键字,您就不用担心GetByName返回的对象类型。

varmyData = GetByName("Zach");
  现在,因为应用了var关键字,GetByName方法能够进行改变,返回一个Person对象,这个方法调用也依然有效。

  2.extension方法

  在C#中,您不能继承和扩充用访问标识符标记为“封装”的类型。但在C# 3.0中,extension方法允许您扩充任何类,甚至是标记为封装的类。例如,如果希望添加一个NoSpaces()方法到字符串类中,我们要定义一个类似列表A中的extension方法。

  列表A

namespaceMyExtensionMethods
{
 public static class Extension
 {
  public static void NoSpaces(this string data)
  {
   return data.Replace(" ", "");
  }
 }
}
  在一个类中导入这个extension方法时,开发者就能够对这个类包含的任何字符串调用NoSapces()方法。

  extension方法的第一个参数决定extension方法的有效类型。在这种情况下,“这个字符串数据”(this string data)表明extension方法适用于字符串类;如果extension方法以“这个对象数据”(this object data)为第一个参数,则说明这个方法对每个对象有效。

  要表明您希望导入extension方法,只需在它们的命名空间中包括一个using指令。例如,要应用上面说明的方法,需要在类文件中包括一个using MyExtensionMethods指令:(列表B)

  列表B

usingMyExtensionMethods;
namespace MyNamespace
{
 public class MyClass
 {
  public MyClass()
  {
   string data = "this is my data";
   //nospaces will contain "thisismydata".
   string nospaces = data.NoSpaces();
  }
 }
}
  注意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对象进行了初始化,但我们并不清楚其中变量的作用:

http://img.warting.com/allimg/2012/c0805/1344104a4AX0-105142.swfCar 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,开发者可以编写出能够搜索任何IEnumerableT数据源的代码。所以除了应用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()
 {
  ListCustomer customers = GetCustomers();
  //Write our query to retrieve customers who have more than
  // 10 orders.
  IEnumerableCustomer queryResult = from customer in customers
  where customer.OrderCount 10
  orderbycustomer.ID
  select customer;
 }
}
  与SQL或XPath不同,LINQ查询用C#,而非第三方语言编写。这样,查询就不会出现类型问题,开发者也就没有必要编写映射代码把查询返回的数据转化成C#对象,而由LINQ API自动处理映射。

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


     推荐:Visual C# 轻松入门全攻略

  1.隐型局部变量

  C# 3.0引入了一个叫做“var”的新关键字。这个关键字允许开发者建立一个变量,但不必明确它的类型。例如,用var说明一个字符串,就像这样:

varmyData = "This is my data";
  注意,这里并没有提到myData变量是一个字符串,而C# 2.0却要求这一点。

  虽然var允许您建立隐含的类型,它并没有降低C#浓厚的类型特征。var关键字只有在建立变量时有用,一旦您建立变量并且确定它的类型以后,就不能再用var来改变一个变量的类型。

  例如,这段代码没有作用:

varmyDate = DateTime.Now;
myDate = "Hello.";
  使用var关键字还会产生一个有趣的结果,它可以帮助开发者减少建立变量时的代码输入。例如,在C# 2.0中建立一个Customer对象,需要输入以下代码:

Customer myCustomer = new Customer();
  使用新的var关键字,则只要输入:

varmyCustomer = new Customer();

  var关键字的另一个特点在于,使用它可以避免改变一个返回某个类型对象的方法调用。例如,在C# 2.0中,如果您需要调用一个返回Customer对象的方法,您应该编写以下代码:

Customer myCustomer = GetByName("Zach");
  如果某个时候GetByName方法返回一个不是Customer的对象,这段代码就无法编译。但是,如果应用var关键字,您就不用担心GetByName返回的对象类型。

varmyData = GetByName("Zach");
  现在,因为应用了var关键字,GetByName方法能够进行改变,返回一个Person对象,这个方法调用也依然有效。

  2.extension方法

  在C#中,您不能继承和扩充用访问标识符标记为“封装”的类型。但在C# 3.0中,extension方法允许您扩充任何类,甚至是标记为封装的类。例如,如果希望添加一个NoSpaces()方法到字符串类中,我们要定义一个类似列表A中的extension方法。

  列表A

namespaceMyExtensionMethods
{
 public static class Extension
 {
  public static void NoSpaces(this string data)
  {
   return data.Replace(" ", "");
  }
 }
}
  在一个类中导入这个extension方法时,开发者就能够对这个类包含的任何字符串调用NoSapces()方法。

  extension方法的第一个参数决定extension方法的有效类型。在这种情况下,“这个字符串数据”(this string data)表明extension方法适用于字符串类;如果extension方法以“这个对象数据”(this object data)为第一个参数,则说明这个方法对每个对象有效。

  要表明您希望导入extension方法,只需在它们的命名空间中包括一个using指令。例如,要应用上面说明的方法,需要在类文件中包括一个using MyExtensionMethods指令:(列表B)

  列表B

usingMyExtensionMethods;
namespace MyNamespace
{
 public class MyClass
 {
  public MyClass()
  {
   string data = "this is my data";
   //nospaces will contain "thisismydata".
   string nospaces = data.NoSpaces();
  }
 }
}
  注意extension方法的优先度比instance方法低。因此如果instance方法和extension方法有同样的签名,则应执行instance方法。

来源:https://www.tulaoshi.com/n/20160219/1606345.html

延伸阅读
标签: 电脑入门
相信很多人都知道什么是系统文件,但很少人知道文本流是什么,其实文本流不难理解,下面图老师小编就给大家详细介绍下Linux文本流,一起来学习下吧。 文本流 文件用于数据的存储,相当于一个个存储数据的房子。我们之前说,所谓的数据是0或者1的序列,但严格来说,Linux以字节(byte)来作为数据的单位,也就是说这个序列每八位(bit)为一...
Java容器类包含List、ArrayList、Vector及map、HashTable、HashMap   ArrayList和HashMap是异步的,Vector和HashTable是同步的,所以Vector和HashTable是线程安全的,而ArrayList和HashMap并不是线程安全的。因为同步需要花费机器时间,所以Vector和HashTable的执行效率要低于ArrayList和HashMap。 Collection ├List  &nbs...
标签: Web开发
用户的交互操作(interaction)驱动着Web站点。理解如何处理响应信息,特别是在使用新的交互操作形式(例如AJAX)的时候,这一点非常重要的。Kris Hadloc解释了AJAX请求-响应过程的本质,你应该了解这些内容,更好地为用户交互操作服务。   请求和响应 AJAX引擎分很多个方面,每个方面都很重要。如果引擎执行发送请求和接收...
标签: Web开发
在使用CSS实现表现的时候,会经常接触到display:inline-block这一属性,无论是初接触Web标准还是接触标准已久的朋友,大都会对这一属性感觉很迷惑和模糊。 display:inline-block 将对象呈递为内联对象,但是对象的内容作为块对象呈递。旁边的内联对象会被呈递在同一行内,允许空格。 但对于这个属性不是所有浏览器都识别。 ...
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者...

经验教程

590

收藏

42
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部