自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入理解C# 3.0的五項(xiàng)主要改進(jìn)

開發(fā) 后端
微軟的動(dòng)作一直比較頻繁,C# 2.0規(guī)范才剛推出不久,大家還沒來的及完全消化C# 2.0中的所有新特性,而今又推出了C# 3.0。在短短幾年中,微軟就對(duì)C#進(jìn)行了兩次大的升級(jí),為C#加入了許多新的特性,從而使C#變得更加強(qiáng)大也更加現(xiàn)代了。下面我們就C# 3.0中的五項(xiàng)主要改進(jìn)深入探討一下。

1.隱型局部變量   

C# 3.0引入了一個(gè)叫做“var”的新關(guān)鍵字。這個(gè)關(guān)鍵字允許開發(fā)者建立一個(gè)變量,但不必明確它的類型。例如,用var說明一個(gè)字符串,就像這樣:

varmyData = "This is my data";

注意,這里并沒有提到myData變量是一個(gè)字符串,而C# 2.0卻要求這一點(diǎn)。

雖然var允許您建立隱含的類型,它并沒有降低C#濃厚的類型特征。var關(guān)鍵字只有在建立變量時(shí)有用,一旦您建立變量并且確定它的類型以后,就不能再用var來改變一個(gè)變量的類型。

例如,這段代碼沒有作用:

varmyDate = DateTime.Now;
myDate = "Hello."; 

使用var關(guān)鍵字還會(huì)產(chǎn)生一個(gè)有趣的結(jié)果,它可以幫助開發(fā)者減少建立變量時(shí)的代碼輸入。例如,在C# 2.0中建立一個(gè)Customer對(duì)象,需要輸入以下代碼:

Customer myCustomer = new Customer(); 

使用新的var關(guān)鍵字,則只要輸入:

varmyCustomer = new Customer();

var關(guān)鍵字的另一個(gè)特點(diǎn)在于,使用它可以避免改變一個(gè)返回某個(gè)類型對(duì)象的方法調(diào)用。例如,在C# 2.0中,如果您需要調(diào)用一個(gè)返回Customer對(duì)象的方法,您應(yīng)該編寫以下代碼:

Customer myCustomer = GetByName("Zach"); 

如果某個(gè)時(shí)候GetByName方法返回一個(gè)不是Customer的對(duì)象,這段代碼就無法編譯。但是,如果應(yīng)用var關(guān)鍵字,您就不用擔(dān)心GetByName返回的對(duì)象類型。

varmyData = GetByName("Zach"); 

現(xiàn)在,因?yàn)閼?yīng)用了var關(guān)鍵字,GetByName方法能夠進(jìn)行改變,返回一個(gè)Person對(duì)象,這個(gè)方法調(diào)用也依然有效。

2.extension方法

在C#中,您不能繼承和擴(kuò)充用訪問標(biāo)識(shí)符標(biāo)記為“封裝”的類型。但在C# 3.0中,extension方法允許您擴(kuò)充任何類,甚至是標(biāo)記為封裝的類。例如,如果希望添加一個(gè)NoSpaces()方法到字符串類中,我們要定義一個(gè)類似列表A中的extension方法。

namespaceMyExtensionMethods
{
 public static class Extension
 {
  public static void NoSpaces(this string data)
  {
   return data.Replace(" ", "");
  }
 }
} 

在一個(gè)類中導(dǎo)入這個(gè)extension方法時(shí),開發(fā)者就能夠?qū)@個(gè)類包含的任何字符串調(diào)用NoSapces()方法。

extension方法的***個(gè)參數(shù)決定extension方法的有效類型。在這種情況下,“這個(gè)字符串?dāng)?shù)據(jù)”(this string data)表明extension方法適用于字符串類;如果extension方法以“這個(gè)對(duì)象數(shù)據(jù)”(this object data)為***個(gè)參數(shù),則說明這個(gè)方法對(duì)每個(gè)對(duì)象有效。

要表明您希望導(dǎo)入extension方法,只需在它們的命名空間中包括一個(gè)using指令。例如,要應(yīng)用上面說明的方法,需要在類文件中包括一個(gè)using MyExtensionMethods指令:

usingMyExtensionMethods;
namespace MyNamespace
{
 public class MyClass
 {
  public MyClass()
  {
   string data = "this is my data";
   //nospaces will contain "thisismydata".
   string nospaces = data.NoSpaces();
  }
 }
} 

注意extension方法的優(yōu)先度比instance方法低。因此如果instance方法和extension方法有同樣的簽名,則應(yīng)執(zhí)行instance方法。

#p#

3.對(duì)象初始化器

在C# 2.0中,開發(fā)者認(rèn)為建立許多構(gòu)造器來設(shè)定某個(gè)屬性值為對(duì)象初始化過程。下面是一個(gè)例子: 類訪問Customer方法:

Customer myCustomer = new Customer("Zach", "Smith"); 

Customer類構(gòu)造器:

public Customer(string firstName, string lastName) : this()
{
 this.FirstName = firstName;
 this.LastName = lastName;
}
public Customer()
{} 

C# 3.0介紹了一個(gè)初始化對(duì)象的新方法,它允許您在初始化對(duì)象時(shí)設(shè)定任何屬性值。例如,在C# 3.0中,上面的代碼塊可以寫成:

類訪問Customer方法:

Customer myCustomer = new Customer{FirstName = "Zach", LastName = "Smith" }; 

Customer類構(gòu)造器:

public Customer()
{} 

在C# 3.0代碼中,沒有與初始化對(duì)象對(duì)應(yīng)的構(gòu)造器。這樣,開發(fā)者就不用為每組需要設(shè)定的屬性建立不同的構(gòu)造器。

這樣產(chǎn)生的另外一個(gè)效果是:代碼變得更容易閱讀了。例如,雖然我們清楚知道下面的代碼對(duì)一個(gè)Car對(duì)象進(jìn)行了初始化,但我們并不清楚其中變量的作用:

Car car = new Car(18, 10, 550); 

一眼看來,下面這行代碼更易閱讀,盡管我們必須輸入更多代碼:

Car car = new Car { WheelDiameter = 18, WheelWidth = 10, Horsepower = 550 }; 

4.匿名類型

C# 2.0引入了匿名方法,C# 3.0推出匿名類型。匿名類型與匿名方法類似,它們都是以嵌入方式建立,并沒有正式的名稱。在建立一個(gè)匿名類型,您必須組合上述對(duì)象初始化器和隱型局部變量?jī)蓚€(gè)概念。下面是一個(gè)匿名類型的例子:

varmyType = new { Length = 79, Width = 30 }; 

匿名類型的范圍與任何其它變量的范圍相同。例如,下面代碼塊中的cobra實(shí)例僅僅在Speed函數(shù)塊中有效:

private void Speed()
{
 var cobra = new { Horsepower = 550, Torque = 570 };
} 

如果一個(gè)匿名類型被初始化而另一個(gè)匿名類型位于范圍域中,并且它們的簽名相同,第二個(gè)類型將自己占用***個(gè)類型的類型。例如,在下面這段代碼中,cobra和mustang都是匿名類型,并且可以彼此設(shè)定。

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#版中,開發(fā)者應(yīng)用許多不同的查詢語言來訪問不同的數(shù)據(jù)源。例如,要查詢一個(gè)XML文件,開發(fā)者會(huì)使用XPath,要查詢一個(gè)SQL數(shù)據(jù)庫,開發(fā)者將使用SQL。在過去這種方法十分有效,并且現(xiàn)在仍然是訪問各種數(shù)據(jù)的主要方法。但是,這種方法具有一些缺點(diǎn)。 一個(gè)顯著的缺點(diǎn)在于:開發(fā)者必須以一種不同的語言,而非他們當(dāng)前使用的語言(如SQL或XPath)來編寫查詢代碼。另一個(gè)缺點(diǎn)是,在執(zhí)行某些查詢語言,如SQL時(shí),開發(fā)者必須編寫映射代碼將查詢結(jié)果轉(zhuǎn)化為可用的C#業(yè)務(wù)對(duì)象。

C#3.0推出一種稱之為語言集成查詢(LINQ)的新方法。應(yīng)用LINQ,開發(fā)者可以編寫出能夠搜索任何IEnumerable<T>數(shù)據(jù)源的代碼。所以除了應(yīng)用TSQL訪問MS SQL數(shù)據(jù)庫,應(yīng)用XPath訪問XML文件外,他們還可以應(yīng)用LINQ。

下面的代碼是一個(gè)LINQ查詢的例子,它返回所有OrderCount大于10的顧客:

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

與SQL或XPath不同,LINQ查詢用C#,而非第三方語言編寫。這樣,查詢就不會(huì)出現(xiàn)類型問題,開發(fā)者也就沒有必要編寫映射代碼把查詢返回的數(shù)據(jù)轉(zhuǎn)化成C#對(duì)象,而由LINQ API自動(dòng)處理映射。

基本上,在ORM解決方案中,LINQ對(duì)象用途很大。同樣,它的范圍也非常廣泛,有大量MSDN信息描述了它的功能。欲了解更多信息,請(qǐng)?jiān)L問LINQ主頁。

【編輯推薦】

  1. C# 3.0新特性之?dāng)U展方法
  2. 理解C# 3.0新特性之Extension方法淺議
  3. C# 3.0新特性系列:隱含類型var
責(zé)任編輯:楊鵬飛 來源: blog
相關(guān)推薦

2009-09-08 16:25:19

C#委托

2025-01-09 12:01:53

2024-05-17 12:56:09

C#編程線程

2024-05-11 07:13:33

C#Task編程

2024-10-11 11:54:14

C#編寫異步

2024-06-25 08:33:48

2024-04-10 12:14:36

C++指針算術(shù)運(yùn)算

2025-01-15 09:34:02

C#屬性方法

2024-07-15 08:21:26

TCPC#連接

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2020-07-21 08:26:08

SpringSecurity過濾器

2022-05-06 16:18:00

Block和 C++OC 類lambda

2024-06-25 08:43:25

C#編程模型

2012-11-22 10:11:16

LispLisp教程

2024-08-07 08:24:57

2023-09-12 11:44:02

C++數(shù)據(jù)對(duì)齊

2024-12-31 00:07:12

2013-09-22 14:57:19

AtWood

2009-09-25 09:14:35

Hibernate日志
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)