.NET Framework泛型知識講解
.NET Framework應(yīng)用程序能夠為開發(fā)人員提供一個可以進行WEB應(yīng)用程序部署的開發(fā)環(huán)境,***程度上幫助程序員提高編程效率。.NET Framework泛型是在.NET Framework2.0的公共語言運行庫(CLR)中的增加的一項新功能,類似于C++的[[模版(程序設(shè)計語言),但不如C++的模板靈活,不過也有一些自己的特性。#t#
泛型為.NET Framework引入了類型參數(shù)的概念,這樣便可以設(shè)計出這樣的類和方法:它們把指定類型的工作推遲到客戶端代碼聲明并實例化類或方法的時候執(zhí)行。比如,通過泛型類型參數(shù)T,程序員就可以編寫其他客戶端代碼能夠使用的單個類,而不用擔(dān)心強制轉(zhuǎn)換或裝箱操作而帶來的額外的運行成本或風(fēng)險。
.NET Framework泛型編程
泛型類和方法較之非泛型類和方法具有更高的可用性、類型安全和效率,且通常用在集合和集合上運行的方法中。在.NET Framework2.0的類庫中添加了一個新的命名空間System.Collections.Generic,其中含有一些新的基于泛型的集合類。微軟建議程序員在設(shè)計面向.NET Framework 2.0的應(yīng)用程序時不要使用舊的非泛型集合類(像ArrayList集合類),而去使用新的泛型集合類。
當(dāng)然,程序員也可以創(chuàng)建自己的泛型類和方法,提供自己需要的解決方案,但微軟不推薦自己創(chuàng)建泛型類,而建議使用.NET Framework類庫中提供的List<T>類。
可以通過泛型類型參數(shù)傳遞一個類型(如一個類TestClass<T>)中的T是泛型的類型參數(shù),可以通過它傳遞一個類型(如int),那么,在這個類中所有用類型參數(shù)(在本例中是T)定義的字段或方法等的類型都會根據(jù)傳遞進來的類型(本例中為int類型)所改變。
.NET Framework泛型類型參數(shù)
在定義泛型類或方法中,類型參數(shù)是客戶端程序?qū)嵗盒皖愖兞繒r指定的類型占位符。泛型類不能像通常的類那樣使用,因為它實際上并不是一個類型,可能更像一個類型的藍圖。要使用泛型類,客戶端代碼必須要指定尖括號中的類型參數(shù)并實例化類型才能構(gòu)造類型。指定的類型參數(shù)可以是編譯器可以識別的任何類型,并且可以構(gòu)造任意數(shù)目的使用不同類型參數(shù)的實例。
命名規(guī)則
通常,微軟推薦采用如下命名規(guī)則:
除非單個字母可以讓其他編寫者了解其含義,而描述性名稱并不能帶來更多其他的意義,應(yīng)該使用描述性短語作為類型參數(shù)的名稱
推薦使用T作為單個字母類型參數(shù)的參數(shù)名
應(yīng)該將T作為有描述性的類型參數(shù)名前綴
推薦在鏟水泥各種指出對這個類型參數(shù)的約束(如將帶有 ISession 約束的參數(shù)名寫為TSession)
.NET Framework泛型參數(shù)的約束
對于泛型參數(shù)的約束是指對客戶端代碼實例化類時指定的類型參數(shù)進行限制,這樣如果客戶端的程序參試使用某個不允許使用的類型實例化類時會產(chǎn)生編譯時錯誤。
約束采用where上下文關(guān)鍵字指定。
為什么使用約束
若要對泛型列表中的項與其他某個項進行比較,便一起需要在一定程度上保證她說調(diào)用的運算符或方法可以得到指定的類型參數(shù)的支持。這個保證正是建立在對泛型類定義的一個或多個約束獲得的。一旦編譯器得到了這樣的保證,它就能夠允許在泛型類中調(diào)用一些無約束的泛型中不允許使用的方法。
未綁定的類型參數(shù)
沒有進行約束的泛型類型參數(shù)稱為未綁定的類型參數(shù)。
當(dāng)使用未綁定的類型參數(shù)時,相對于使用了約束的類型參數(shù),有以下規(guī)則:
不允許使用!=和==運算符,因為編譯器無法保證獲得實例化時賦予的類型參數(shù)的支持;但可以與null進行比較。如果類型參數(shù)為值類型的話,一定返回false。
可以與System.Object將互相轉(zhuǎn)換,也可以將它們顯式地轉(zhuǎn)換為任何借口類型
裸類型約束
泛型類
泛型類可以擁有至少一個泛型類型參數(shù),泛型類型參數(shù)可以代替泛型類的字段、屬性、方法的參數(shù)和返回值、事件的參數(shù)和返回值、構(gòu)造函數(shù)的參數(shù)的類型,也可作為內(nèi)部類和基類以及實現(xiàn)接口的泛型類型參數(shù)。
泛型類必須在創(chuàng)建其實例時明確指定其所有泛型類型參數(shù)的類型。泛型類的構(gòu)造函數(shù)不能自動推斷其泛型類型的泛型類型參數(shù)。
如果從泛型類派生,可以選擇確定的泛型類型參數(shù),也可以用泛型派生類,利用泛型派生類的泛型類型參數(shù)確定基類的泛型類型參數(shù)。
泛型接口
泛型接口的使用大體上與泛型類相同,只是接口不允許包含字段和構(gòu)造函數(shù),也不允許創(chuàng)建實例。實現(xiàn)接口時,同樣也可以選擇實現(xiàn)確定的泛型類型接口,或者利用泛型類型參數(shù)確定接口的泛型類型參數(shù)。
.NET Framework泛型方法
泛型方法可以擁有至少一個泛型類型參數(shù),泛型類型參數(shù)可以作為方法的參數(shù)或返回值的類型。泛型方法不用明確指定各泛型類型參數(shù),可由上下文自動推斷,如果上下文無法自動推斷,則必須明確指定。
泛型委托
泛型委托的使用大體上與泛型方法相同,泛型委托的泛型類型參數(shù)可以在創(chuàng)建時通過上下文自動推斷。泛型委托實例總是具有確定的泛型類型參數(shù)。
反射
.NET Framework泛型和C++中模版的區(qū)別
泛型和模版都是用于提供類型參數(shù)支持的語言功能,但這兩者有著諸多差異。
從語法層面上來說,一般認為泛型是一種相對模版簡單的方法,而不具有模版的復(fù)雜性。但同時,泛型也不能提供模版的完整功能。
另一方面,從實現(xiàn)層面,泛型的替換是在運行時執(zhí)行的,這樣可以為實例化的對象保留泛型類型的信息。
下面列出了泛型和模版之間的主要區(qū)別:
泛型沒有提供與模版相同程度的靈活性(如泛型不能調(diào)用算數(shù)運算符)
泛型不允許非類型模版參數(shù)(如template C<int i>{})
泛型不支持顯式的特定類型模版的自定義實現(xiàn)
泛型不支持類型參數(shù)子集的自定義實現(xiàn)
泛型中不允許將類型參數(shù)作泛型類型的基類
泛型不允許類型參數(shù)具有默認類型,而必須在實例化時指定
.NET Framework泛型類型參數(shù)自身不能是泛型,但C++確實允許模版參數(shù)。
C++允許程序員編寫可能對模版中某些類型參數(shù)無效的代碼,然后將檢查該代碼中是否有用作類型參數(shù)的特定類型。比如說可以在C++中編寫對類型參數(shù)對象的算術(shù)運算符的函數(shù),這樣在用不支持這些運算符的類型實例化模版時出現(xiàn)出現(xiàn)錯誤;而泛型是不允許這樣的,它則要求相應(yīng)地編寫類當(dāng)中的代碼,使他們能夠滿足任何約束的類型。因此唯一允許的語言構(gòu)造是那些能夠從約束中推導(dǎo)出來的結(jié)構(gòu)。