明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

C# 3.0語言詳細(xì)說明之基本的語言增強

[摘要]Linq項目簡介和開發(fā)環(huán)境的搭建   9月份,微軟推出了一項名為“Linq項目”的新技術(shù),用于在.NET語言中集成數(shù)據(jù)查詢的功能。您可以從http://msdn.microsoft.com/netframework/future/得到Linq項目的技術(shù)預(yù)覽版,其中包括大量的介紹文章(英文)和C...
Linq項目簡介和開發(fā)環(huán)境的搭建  

  9月份,微軟推出了一項名為“Linq項目”的新技術(shù),用于在.NET語言中集成數(shù)據(jù)查詢的功能。您可以從http://msdn.microsoft.com/netframework/future/得到Linq項目的技術(shù)預(yù)覽版,其中包括大量的介紹文章(英文)和C# 3.0以及VB 9.0的編譯器。  

  Linq項目英文全稱為Language Integrated Query,即“語言集成查詢”。Linq基于.NET Framework 2.0,通過對語言的改進(jìn),實現(xiàn)在直接在語言中通過類似SQL語句的構(gòu)造對數(shù)據(jù)源進(jìn)行查詢,可查詢的數(shù)據(jù)源從基本的順序結(jié)構(gòu)(如數(shù)組和鏈表)延伸到關(guān)系型數(shù)據(jù)庫(目前是SQL Server,相信將來可以擴展到幾乎所有的關(guān)系型數(shù)據(jù)庫)和XML。  

  C# 3.0是C#語言再一次升級后的版本,率先實現(xiàn)了Linq的概念;同樣實現(xiàn)了Linq的還有VB 9.0。從上面提到的網(wǎng)址,讀者可以找到兩種語言的編譯器的技術(shù)預(yù)覽版。在本文中我們將以C# 3.0為中心討論其開發(fā)環(huán)境的搭建和語言改進(jìn)。下載得到的是一個名為“l(fā)inq preview.msi”(也可能不同)的安裝包,雙擊之后可以和其他軟件一樣進(jìn)行安裝,此處不再贅述。該安裝包為Visual Studio 2005 Beta 2及以后的版本和Visual C# 2005 Beta 2提供了插件(項目模板)和C#編譯器,該編譯器生成的IL代碼可以直接在.NET Framework 2.0上運行。在安裝了該預(yù)覽版后,在新建項目對話框中項目類型列表的Visual C#節(jié)點下,我們可以看到一個Linq Preview的條目,并可以在右邊的項目模板中選擇一些桌面項目模板(Linq暫時還不支持Web項目)。  
只要選中了Linq中的項目模板,我們就可以像編寫其他應(yīng)用程序一樣在Visual Studio 2005中開始編寫C# 3.0應(yīng)用程序了,在編譯的時候IDE會自動為我們選擇C# 3.0的編譯器。  

  現(xiàn)在我們已經(jīng)可以開始編寫C# 3.0應(yīng)用程序了,后面的章節(jié)中我就將為大家講解C# 3.0所帶來的語言增強。值得說明的一點是,本文是一個系列文章中的一篇,這一系列文章共三個部分。本文為第一部分,講述C# 3.0種基本的語言增強,這些語言增強其實是其他兩個部分的基礎(chǔ);第二部分將講述C# 3.0中的Lambda表達(dá)式,這是匿名方法的自然進(jìn)化形式,它不僅能將表達(dá)式體現(xiàn)為可執(zhí)行的方法(委托),也能將表達(dá)式體現(xiàn)為可以在運行時進(jìn)行操作的數(shù)據(jù)結(jié)構(gòu)——表達(dá)式樹;最后一部分講述的才是Linq項目中最核心的也是最激動人心的內(nèi)容——查詢表達(dá)式,這是Linq在C#中的實現(xiàn)形式。同時,Linq還針對SQL查詢和XML查詢對.NET Framework基礎(chǔ)類庫進(jìn)行了擴充,分別稱作DLinq和XLinq,這些內(nèi)容我將在其他系列文章中為大家講述。  

  在本文的講述過程中,限于篇幅,僅提供了簡短的代碼段而不是完整的代碼。不過這些代碼段是從完整的、可正確編譯和運行的代碼中抽取出來的,這些完整代碼可以從這里下載,并且在本文的第5部分中有關(guān)于完整代碼的介紹。  

具有隱式類型的聲明 

  在一個帶有初始化器的聲明語句中,待聲明的變量的類型是顯而易見的——和初始化表達(dá)式的結(jié)果類型一致。對于這種情況,在C# 3.0中可以使用新增的關(guān)鍵字var來代替聲明中的類型,而由編譯器根據(jù)初始化表達(dá)式來推斷出變量的類型。 

var i = 5; // int 
var d = 9.0; // double 
var s = "Hello"; // string 
var a = new int[] { 1, 2, 3, 4, 5 }; // int[] 

Console.WriteLine("Type of variable : {0}", i.GetType()); 
Console.WriteLine("Type of variable : {0}", d.GetType()); 
Console.WriteLine("Type of variable : {0}", s.GetType()); 
Console.WriteLine("Type of variable : {0}", a.GetType());  

  上面的代碼在C# 3.0中是符合語法規(guī)則的,前四行代碼就是使用了隱式類型的聲明;而后四行代碼用于在運行時驗證各個變量是否擁有正確的類型。如果在Visual Studio 2005中運行這段代碼(為了能夠看到結(jié)果,請使用Ctrl+F5來編譯并啟動程序),會得到下面的結(jié)果: 

Type of variable : System.Int32 
Type of variable : System.Double 
Type of variable : System.String 
Type of variable : System.Int32[]  

  這表明,編譯器在編譯的時候,已經(jīng)正確地推斷了每個變量的類型,并將其嵌入到了程序集的元數(shù)據(jù)中。 

  這里有兩個限制,一是具有隱式類型的聲明只能作用在局部變量上,二是這種聲明必須有初始化器(即等號和后面的表達(dá)式)。如果我們企圖在一個類中聲明一個具有隱式類型的域,就會出現(xiàn)一個編譯錯誤:Invalid token ’var’ in class, struct, or interface member declaration;而如果聲明中沒有出現(xiàn)初始化器,則會導(dǎo)致另外一個編譯錯誤:’=’ expected。 

  除了局部變量外,作用域為一個塊的數(shù)組也可以運用具有隱式類型的聲明,例如: 

var ia = new [] { 1, 2, 3, 4, 5 }; // int[] 
var da = new [] { 1.1, 2, 3, 4, 5 }; // double[] 
var sa = new [] { "Hello", "World" }; // string[] 

Console.WriteLine("Type of array : {0}", ia.GetType()); 
Console.WriteLine("Type of array : {0}", da.GetType()); 
Console.WriteLine("Type of array : {0}", sa.GetType());  

  在上面例子的數(shù)組聲明中,在運算符new和表示數(shù)組聲明的一對方括號之間省略了類型名字,但這在C# 3.0中仍然是符合語法規(guī)則的。編譯器會通過成員列表中的值的類型來推斷數(shù)組的類型。編譯并運行上面的例子,會得到如下的輸出: 

Type of array : System.Int32[] 
Type of array : System.Double[] 
Type of array : System.String[]  

  除了和具有隱式類型的局部變量具有相同的約束外,具有隱式類型的數(shù)組還有必須尊從這樣一個規(guī)則,即成員列表中的所有值必須是兼容的。也就是說,成員列表中必須存在這樣一個值,使得其他值可以隱式地轉(zhuǎn)換為該值的類型。因此,下面的聲明是不符合語法規(guī)則的: 

var aa = new [] { 1, "Hello", 2.0, "World" };  

  如果試圖編譯上面的代碼,會得到一個編譯錯誤:No array type can be inferred from the initializers。這是因為編譯器無法根據(jù)成員列表中的值來推斷數(shù)組的類型。 

  實際上,盡管具有隱式類型的聲明使得傳統(tǒng)聲明的編寫方法更加便利,然而引入這種聲明方式的真正目的并不在于此,而是為了使局部變量和數(shù)組能夠訪問這樣一個新的語言構(gòu)造:匿名類型。 

[1] [2]  下一頁