天天看點

《聖殿祭司的ASP.NET4.0專家技術手冊》---- 2-7 隐含類型局部變量及數組聲明

本節書摘來自異步社群《聖殿祭司的asp.net4.0專家技術手冊》一書中的第2章,第7節,作者: 奚江華,譯者: 武海軍 , 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

聖殿祭司的asp.net4.0專家技術手冊

以var聲明的類型,叫做“隐含類型聲明”,像傳統javascrip一樣以var聲明變量或對象。

以下用var隐含類型聲明數值及字元串的方式:

var隐含類型聲明創造的最大目的是,為了配合linq查詢文法與匿名類型(anonymous type)的特性,因為很多時候在聲明linq查詢匿名類型時,使用var關鍵字來聲明類型,可讓文法變得十分精簡,而不必為了類型的指定而花太多力氣。

var隐含類型聲明常應用在:①隐含類型局部變量、②隐含類型數組、③匿名類型對象,如圖2-4所示,後續将詳述這3種應用。

《聖殿祭司的ASP.NET4.0專家技術手冊》---- 2-7 隐含類型局部變量及數組聲明

附注 當然隐含類型可接受的類型還更多,在這僅介紹比較常用的,在2-6-5小節列出其他隐含類型。

隐含類型局部變量(implicitly typed local variables),顧名思義,就是利用var在一個區域(指方法)中聲明隐含類型的變量。

範例2-2 基本var隐含類型局部變量聲明

在此以var關鍵字聲明隐含類型局部變量,并進行加法運算,請參考varvarible.aspx程式:

《聖殿祭司的ASP.NET4.0專家技術手冊》---- 2-7 隐含類型局部變量及數組聲明

程式說明

a+b運算的結果是15。但勿将var的聲明文法搬到.net 1.0或2.0環境中使用,因為不支援。

var除了聲明局部變量外,也可用來聲明隐含類型數組(implicitly typed arrays)。隐含類型數組是通過new[]關鍵字來聲明。以下說明傳統數組與隐含類型數組文法上的差異。

1.int類型數組文法

以下為傳統int類型數組與隐含類型數組的差異,其中隐含類型數組聲明,完全不需指定int類型,而其類型是由數組元素(element)推斷而來(編譯器會進行類型推論與判斷)。

2.string類型數組文法

以下為傳統string類型數組與隐含類型數組的差異。

程式:arraysample.aspx 隐含類型數組聲明

《聖殿祭司的ASP.NET4.0專家技術手冊》---- 2-7 隐含類型局部變量及數組聲明

3.不規則數組文法

以下為傳統int類型不規則數組與隐含類型不規則數組的差異。

《聖殿祭司的ASP.NET4.0專家技術手冊》---- 2-7 隐含類型局部變量及數組聲明

範例2-3 隐含類型數組的定義與linq查詢運用

前面var程式中,隐含類型數組在聲明上沒有太大難處,但其實查詢與運用才是重點,是以,在此要探讨隐含類型數組與傳統文法在查詢上的差異,且使用linq來查詢數組的資料。在此以汽車銷售為例,請參考impilicityarray.aspx程式:

《聖殿祭司的ASP.NET4.0專家技術手冊》---- 2-7 隐含類型局部變量及數組聲明

..iconn01.tif 若是單純對數組内容的讀取,可使用傳統的for,若以var聲明的linq查詢表達式,則可用foreach來讀取。

..iconn02.tif 至于foreach中,類型的聲明可用var或int明确類型。

..iconn03.tif 隐含類型數組聲明好之後,可用linq進行查詢(選擇性,非必要),進行條件的篩選。

程式的執行結果如圖2-5所示。

《聖殿祭司的ASP.NET4.0專家技術手冊》---- 2-7 隐含類型局部變量及數組聲明

1級提醒

 隐含類型隻支援一維的數組,不支援多元的。

當使用匿名類型對象時,有很高的幾率搭配var隐含類型,因為匿名類型對象隻能指定給var所聲明隐含類型。var創造的最大的目的是,為了配合匿名類型文法。

範例2-4 匿名類型搭配var隐含類型聲明

以下匿名類型中是個人基本資料,然後再指派給var隐含類型的person對象,請參考varanonymous.aspx程式:

《聖殿祭司的ASP.NET4.0專家技術手冊》---- 2-7 隐含類型局部變量及數組聲明

..iconn01.tif 第3行程式中以var聲明了一個匿名類型對象,裡面同時包含了string字元串與int數值,請問我們該叫person為什麼類型呢?

..iconn02.tif 若c# 3.0不發明“var”隐含類型聲明,坦白講person這樣的匿名類型對象根本無法直接用一種類型對應。

..iconn03.tif 但就算var屬于隐含類型聲明,也不表示所聲明的對象或變量沒有類型,隻是無法刻意用一個确定類型名稱來描述它,故統稱匿名類型。

..iconn04.tif 程式在編譯時,會為person這個anonymous type對象私下取一個名字,叫做“<>f__anonymoustype0'3[system.string, system.int32,system.int32]”,它的名字中帶有anonymoustype字眼,而且類型确定的強類型對象,而不是沒有名字、沒有類型的未知對象,用gettype()方法就能查知。有點像老子《道德經》中所說:“道本無名,強名曰道”的意思,系統很清楚這個對象名字與類型,但不好用人類懂的術語來講(如string或int),但人類又強要個名字,故隻好弄個假名“anonymoustype”,好讓你不再困惑。

程式執行結果如圖2-6所示。

《聖殿祭司的ASP.NET4.0專家技術手冊》---- 2-7 隐含類型局部變量及數組聲明

但var隐含類型的本質,完全不是javascript的var變量聲明那回事,若你以為兩者是同一特性就大錯特錯了。c# 3.0隻不過借用var避開了一開始某些類型聲明上的困難,以增加靈活性,但骨子裡卻仍然是靜态語言及強類型的堅持者,和javascript的var聲明完全不同,以下是說明:

類型确定時期:var在編譯時就确定了類型,但javascript要在運作時才會知道類型,這對程式品質與穩定性有很大影響。

類型推論:以var所聲明的變量或數組,其類型之是以能确定,是因為var會訓示編譯器去推論變量或對象正确類型,而推論的基礎在于“=”等号右方的表示式類型,例如,var a=123,則編譯器就會将a視為int類型,若var a=“kevin”,自然a就是string類型了。

類型變更限制:從.net 1.0開始,一旦聲明類型後,類型就無法在運作時任意更換,即使使用了var聲明,但編譯後的類型早已确定,運作時一樣不允許更換類型,例如,聲明了var a =123,a就是int類型,不能再動态指定a =“kevin”,編譯程式會警告錯誤;但javascript以var聲明的變量類型,可以在運作時任意改變類型,沒有限制。

類型:var能接受或聲明的類型有.net framework系統内建類型、.net framework class library中定義的類型、anonymous type類型、使用者自定義類型(user-defined)或其他任何的表示式。

與linq搭配:linq查詢常會搭配var聲明。

1.var聲明使用範圍

使用“var”關鍵字聲明變量或對象,範圍是有限制的:

隻能在方法層級中使用,聲明局部變量,不能在類層級中聲明為全局變量;

在for的語句中使用,如for(var x = 0; x < 50; x++){…};

在foreach的語句中使用,如foreach(var item in list){...};

using (var file = new streamreader("c:myfile.txt")) {...}。

2.var聲明錯誤示範

以下var為不合法的例子。

程式:varclass.cs var不合法聲明例子

《聖殿祭司的ASP.NET4.0專家技術手冊》---- 2-7 隐含類型局部變量及數組聲明

是以看到var種種限制後,應能了解var的運用傾向于配合c# 3.0新文法功能的靈活性運用,而不是用來全面替代明确類型的聲明。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀