掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
C#泛型是.NET中最常見的一種特性,接下來我們就來了解關(guān)于C#泛型的一些特性,看一下代碼:

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),尖扎企業(yè)網(wǎng)站建設(shè),尖扎品牌網(wǎng)站建設(shè),網(wǎng)站定制,尖扎網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,尖扎網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
- public class Dictionary
- {
- public void Add(K key, V value)
- {
- if (key.CompareTo(x) < 0) {} // Error, no CompareTo method
- }
- }
由于K可以任何類型,所以可想而知,key只能使用Object中定義的ToString等方法。代碼在編譯時就出錯了,因為key可能不含有CompareTo方法。那么如何解決呢?一種容易想到的辦法就是把key轉(zhuǎn)換成IComparable,那么代碼就變成了這樣:
- public class Dictionary
- {
- public void Add(K key, V value)
- {
- if (((IComparable)key).CompareTo(x) < 0) {}
- }
- }
這次沒有編譯時錯誤了。但是還是要小心,因為實際使用時,如果你使用了一個沒有實現(xiàn)IComparable的類型作參數(shù),就會出現(xiàn)InvalidCastException異常。為了提供強編譯時檢查和減少類型轉(zhuǎn)換,C#2.0泛型引入了約束(Constraints)這個概念,這是一個泛型的可選項。語法是使用where關(guān)鍵字指明約束的類型參數(shù),然后加冒號,再加上類,接口,類型參數(shù)等。我們把代碼變成了這樣:
- public class Dictionary
where K: IComparable - {
- public void Add(K key, V value)
- {
- if (key.CompareTo(x) < 0) {}
- }
- }
這樣就保證了任何為K類型參數(shù)提供的類型都實現(xiàn)了IComparable接口。所以我們的key就可以使用CompareTo方法了。如果我們在使用時提供了沒有實現(xiàn)IComparable接口的類型,就會出現(xiàn)編譯時錯誤,我們的約束可以不止是一個接口,可以是多個,還可以是跟類或其他約束混合,請看下面代碼:
- public class EntityTable
- where K: IComparable
, IPersistable - where E: Entity, new()
- {
- public void Add(K key, E entity)
- {
- if (key.CompareTo(x) < 0) {}
- }
- }
對于約束new()可能不好理解。其實這個約束保證了提供給類型參數(shù)E的類型必須有一個public,無參的構(gòu)造器。這樣它就允許泛型類使用new E()創(chuàng)建這個類型的實例。另外指出的是,雖然可以有多個接口作約束,但至多只能有一個類。
類型參數(shù)必須小心地使用。雖然它提供了更強編譯時類型檢查,但是卻也約束了泛型類型的一些可能的使用情況。比如說,有一個泛型類List
本文轉(zhuǎn)載自小新的技術(shù)天地的博客,
原文地址:http://wdxinren.cnblogs.com/archive/2005/05/29/164392.html
【編輯推薦】

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流