精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解C#泛型特性及相關實例

開發 后端
在這里我們將討論的是C#泛型特性及相關實例,希望通過本文如此詳細的介紹,能對大家了解泛型有所幫助。

本文將為大家講述.NET中最常見的一種特性,C#泛型。希望通過本文能幫助大家更好的學習和理解C#泛型,在平時的開發工作中起到事半功倍的效果。

#T#

泛型,.NET的這個特性相信大家都已經很熟悉了,提起泛型,不能不首先提到C++中的模板,C++中模板的引入大大提高了代碼的重用性,因此也得到了許多程序員的喜愛。因此,在同為強類型語言平臺的.NET 2.0和Java 1.5中,它們也都不約而同的引入了泛型的對語言和平臺的支持。不過雖然三種語言最終都提供了將類型參數化的功能,然而這個功能在三個平臺或語言中的實現卻大大不同。相對來說,C++的模板功能是三者中最為強大的,不過由于.Net和Java對類型安全和穩定性要求更高,它們對泛型的支持要稍微簡單,不過即使如此,二者對泛型特性的實現也引起了兩個陣營中程序員們的爭論,不過最終普遍認為Java的偽泛型(擦拭法)要比.NET的JIT級別的真正的泛型性能要差(java仍然有裝箱,拆箱操作)。當然這些是后話,下面我們來看看.NET的泛型到底如何使用吧!

基本介紹

.NET 2.0以后以后支持在很多類型上使用泛型,包括類、結構、接口、委托和方法成員,在這些類型上使用泛型和在類上使用是一樣的。它甚至支持同一個接口但不同泛型類型的實現,這有點類似重載在類級別的實現。***.NET允許你同時定義多個泛型類型。

在泛型方法中的泛型類型基本跟在類中使用情況一樣,不過泛型方法有一個方便程序員的地方就是它的類型推斷功能,這意味著程序員可以即能和使用普通方法一樣使用這些方法,同時又能享受泛型帶來的方便。e.g.

代碼

  1. static void Test<T, U>(T t, U u) { }static void main(){  
  2. //在函數中我們可以不用聲明參數類型,編譯器會自動根據實際數據   
  3. //自動推斷類型  
  4. Test(10, "20");Test(1.1, 2.2);} 

下面我們來看看泛型在.NET中使用的一些需要注意的地方。

1. 泛型在嵌套類中的使用。嵌套的子類會自動繼承(?)包裹類的泛型類型,當然,你也可以在嵌套類中覆蓋掉包裹類的類型,不過編譯器會在編譯的時候發出警告來提醒用戶注意避免誤寫。e.g.

  1. class Container<T, U>{  
  2. //編譯器會在這里發出警告  
  3. //告訴用戶這里的泛型和包裹類相同  
  4. class Nested<U>{ void Method(T p0, U p1) { }}} 

2. 協變和逆變的問題。關于協變和逆變的定義簡單來說就是泛型類型是否允許子類和父類之間轉換,這里不做詳細討論,讀者如果有興趣可以參考這篇文章。在.net 4.0以前是不支持協變和逆變的,這也讓我們的代碼有些時候實現起來很別扭。下面可以看個簡單的例子(注:這個例子僅作說明用,不一定恰當)。

首先我們定義兩個數據類型,IData和IOperation:

  1. interface IData{void method();}  
  2. interface IOperation<T>   
  3. where T : IData{ void Run(T data);} 

然后我們分別定義不同類型的數據和操作類:

代碼

  1. class AddData : IData{public int A1, A2;  
  2. public void method() { }}class Add : IOperation<AddData>  
  3. {public void Run(AddData d)  
  4. {Console.WriteLine(d.A1 + d.A2);}}  
  5. class ComplexData : IData{public void method() { }  
  6. public int A1, A2, B1, B2;}  
  7. class ComplexAdd : IOperation<ComplexData>{  
  8. public void Run(ComplexData d){Console.WriteLine("{0}+{1}  
  9. i",d.A1 + d.A2,d.B1+d.B2);}} 

這里如果能這樣使用我們認為應該是安全的:

  1. IOperation<IData> opr = new Add();opr.Run(data1);  
  2. opr = new ComplexAdd();opr.Run(data2); 

然而這樣的代碼是無法通過編譯的,盡管我們知道它們的使用絕對安全的,因為AddData或ComplexData是IData的子類。幸運的是,在.Net4.0中程序員將不會有這個煩惱了。

3. 泛型不支持操作符。在C++中模板支持操作符,然而,由于操作符是靜態的并且是編譯時決定的(參看這篇文章),因此作為運行時的泛型無法實現類型間的該項操作,雖然你可以通過接口來達到同樣功能,但方便的操作符終究無法在泛型中得到支持。這可以算是C#泛型的一個缺點,因為在很多時候它確實很有用。

4. 泛型的類型轉換問題。泛型無法從其他類型(object除外)直接強制轉換,這個時候如果需要將其他類型轉換為泛型對象時有兩種方式,一種是該泛型約束是class或基類,這時候可以通過as 操作符來轉換,如 return somevalue as T。但是有時候如果我們不知道該泛型的類型或者該泛型類型是struct該如何轉換呢?答案是通過兩次類型轉換,首先我們把待轉換對象轉換為object對象,然后直接對該object對象強制轉換為T,e.g. return (T)(object)someVar。具體例子你可以參考這篇文章。

***,在泛型中有個關鍵字--default,顧名思義,它是在引用類型和值類型沒有初始化的時候提供默認值的。對引用類型默認值是null,值類型則是0.

泛型約束

如果.Net僅僅出現泛型而沒有泛型約束,我想泛型的功能一定會大打折扣的,正是有了泛型約束,才讓我們在操作這些類型更加規范和準確。這也是同為強類型的C#比C++的模板更安全的一點。

和類聲明繼承關系時一樣,泛型約束可以聲明多個接口和最多一個基類約束,并且如果聲明了基類約束,類約束必須放在約束條件的首位,這和我們聲明類的繼承關系要求一樣。另外,聲明約束的類不能是密封類或某些特殊的結構(如Nullable<T>),如我們不能聲明約束類為string或System.Nullable<T>.***,與我們在類聲明多個接口繼承關系一樣,泛型的約束間是AND而非OR關系,也就是說,如果你添加了多個約束,那么泛型使用必須滿足所有的約束條件。

我們可以通過關鍵字class和struct來限定類型是值類型還是引用類型,不過由于基類約束已經表明了泛型類型是類還是結構,所以我們不能同時將class或struct約束和基類(結構)約束一起使用,e.g.class ClassA<T>where T:BaseClass,class 是不允許的。另外一個需要注意的就是class和struct約束也必須在其他任何約束條件之前。

另外一個值得注意的約束關鍵字是new(), new 關鍵字意味著泛型對象必須提供一個無參構造函數,需要注意的是,new()約束必須放在所有約束的***面。這個約束有時會有用,不過有時看起來更像雞肋。首先,new()約束雖然表明你可以在類中對泛型對象使用new()操作符實例化對象,然而在CIL對該對象的實例化仍然是通過反射來實現的,即T a=new T()相當于T a = System. Activator. CreateInstance<T>();這樣程序效率會有所降低。另一方面,目前new約束僅僅支持無參構造函數的約束,而無法支持用戶自定義參數的構造函數約束,雖然用戶可以自己通過工廠方法來傳遞參數,但終究不夠自由,這讓new()約束有時沒太大用武之地。

約束不支持委托和枚舉類型,例如,你不能這樣定義:class ClassA<T> where T:Delegate. 這是由于委托和枚舉被認為是特殊的類,它無法被指定為類型參數。編譯器無法根據Delegate來完成編譯器的類型檢查。

***類型約束支持繼承,但同時你必須在子類定義泛型的時候再重新聲明一遍父類的所有約束。設計者的出發點是讓程序員能清楚子類中約束從何而來,減少疑惑。但從另外個角度來講,這樣反而會讓程序員不得不多添加一些重復的代碼,即使你已經知道它的約束條件都有哪些。

泛型內部實現

泛型在.NET中真正做到了平臺級別的支持,在C#中,泛型同樣是對象。事實上,編譯器會在編譯的時候將泛型參數轉換為特殊的元數據,CLR會根據需要生成其實際的類型。為避免裝箱和拆箱,值類型的泛型實現和引用類型的是不一樣的。下面我們來具體看看它們有和不同。

1. 值類型的泛型對象實例化

***次用值類型作為參數來構造泛型類型時,運行庫會創建專用泛型類型,將提供的參數代入到 MSIL 中的適合位置。對于每個用作參數的唯一值類型,都會創建一次專用C# 泛型類型。這種特定類型的泛型類其實就相當于包含特定值類型的本地代碼,它將對性能提升很有幫助。

2. 引用類型的泛型對象實例化

對于引用類型,泛型的工作方式略有不同。***次使用任何引用類型構造泛型類型時,運行庫會創建專用泛型類型。用對象引用(或者說指針更好)替換MSIL中的參數.然后,每次使用對象的引用作為參數來實例化。構造類型時,無論引用類型的詳細類型是什么,運行庫都會重用以前創建的泛型類型的專用版本。之所以可以這樣, 是因為所有對象引用的大小相同 。

總結

在.NET類庫中處處都可以看到泛型的身影,尤其是數組和集合中,泛型的存在也大大提高了程序員的開發效率。更重要的是,C#的泛型比C++的模板使用更加安全,并且通過避免裝箱和拆箱操作來達到性能提升的目的。因此,我們很有必要掌握并善用這個強大的語言特性。 

原文標題:C# 特性復習之泛型

鏈接:http://www.cnblogs.com/jujusharp/archive/2009/12/23/CSharp-generic-you-need-know.html

責任編輯:彭凡 來源: 博客園
相關推薦

2009-08-24 18:22:05

C# 泛型編程

2009-08-24 10:37:27

C# 泛型

2009-08-24 17:58:19

C# 泛型集合

2009-08-24 11:35:20

C# 泛型應用

2024-10-21 07:05:14

C#特性語言

2024-07-10 08:31:59

C#特性代碼

2009-08-28 15:16:18

C#泛型集合

2009-09-07 05:50:59

C# Timer用法

2009-08-26 09:36:03

C#泛型

2009-08-14 09:27:27

C#構造函數的特性

2009-09-02 17:38:16

C#泛型支持

2009-08-24 15:12:13

C# 泛型接口

2009-08-24 18:15:24

C# Dictiona

2009-08-24 14:43:35

C# 泛型

2009-06-24 10:25:25

C#泛型

2009-08-24 14:51:25

C# 泛型泛型類型

2009-08-24 15:38:21

C# 泛型數組

2009-08-24 14:26:42

C# 泛型類

2009-08-07 15:38:15

精通C#數據庫編程

2009-08-24 14:20:13

C# 強制類型轉換
點贊
收藏

51CTO技術棧公眾號

欧美日韩国产高清| 周于希免费高清在线观看| 麻豆精品视频在线| 中文字幕在线成人| 爽爽爽在线观看| av在线官网| 成人国产电影网| 国产91免费看片| 日本一级片免费| av日韩一区| 亚洲第一成年网| 欧美最大成人综合网| 一级黄色片在线看| 亚洲视频日本| 在线播放日韩av| 9191在线视频| 欧美va在线观看| 亚洲精品国产第一综合99久久| 国产精品亚洲综合| 中文字幕免费高清网站| 影音先锋日韩在线| 亚洲精品一二区| 日本视频久久久| 人妻互换一区二区激情偷拍| 伊人久久噜噜噜躁狠狠躁| 丁香五六月婷婷久久激情| 亚洲欧洲在线一区| 少妇激情av一区二区| 精品制服美女久久| 51久久精品夜色国产麻豆| 国内毛片毛片毛片毛片毛片| 欧美一性一交| 日韩一级片在线观看| 欧美一区二区高清在线观看| 91激情在线观看| 国产亚洲一级| 欧美大秀在线观看| 快灬快灬一下爽蜜桃在线观看| 亚洲五码在线| 3d动漫精品啪啪| 国产视频一区二区三区在线播放| 免费在线国产视频| 亚洲天天做日日做天天谢日日欢 | 欧美日韩一区国产| 国产原创中文在线观看| jizz性欧美| 亚洲国产岛国毛片在线| 久久综合狠狠综合久久综青草| 99久久精品日本一区二区免费| 日韩一区精品视频| 国产91精品青草社区| 青青草国产在线观看| 久久91精品| 亚洲第一区在线| 丰满人妻一区二区三区大胸| 日韩综合久久| 欧美日韩精品一区二区三区 | 图片区偷拍区小说区| 亚洲欧美综合久久久久久v动漫| 色999日韩国产欧美一区二区| 成人免费aaa| 51精品视频| 亚洲图片欧美色图| 欧美日韩福利在线| 里番在线播放| 午夜视频在线观看一区二区| 日韩一级特黄毛片| 亚洲精品一线| 亚洲一区二区三区中文字幕在线| 日韩视频在线免费播放| 男人的天堂在线视频免费观看 | 中文字幕第九页| 中文字幕一区日韩精品| 日韩欧美成人一区| 韩国黄色一级片| 51精品国产| 精品久久久久久综合日本欧美 | 91免费看视频| 欧美精品一区在线| 成人高清网站| 一色屋精品亚洲香蕉网站| 亚洲一卡二卡三卡| 成人福利在线观看视频| 亚洲男人的天堂网| 日本阿v视频在线观看| 极品av在线| 一本色道**综合亚洲精品蜜桃冫| 密臀av一区二区三区| 日韩伦理一区二区| 精品免费一区二区三区| 91精品小视频| 精品免费一区二区| 日韩在线免费av| 加勒比婷婷色综合久久| 亚洲私拍自拍| 热99在线视频| 91高潮大合集爽到抽搐| 国产精品伊人色| 精品免费视频123区| 国产一区二区三区不卡在线| 国产精品久久三| 91.com在线| 日韩国产网站| 日韩一级完整毛片| 国产精品亚洲无码| 66国产精品| 欧美一区二区三区精品电影| 久久国产香蕉视频| 国产成人综合自拍| 日本视频一区在线观看| 国产原创在线观看| 欧美日韩在线一区| 久国产精品视频| 91精品啪在线观看国产手机 | 精品国产一区在线| 日韩欧美中字| 91高清免费视频| 99久久久久成人国产免费| 91麻豆精品秘密| 一区二区三区日韩视频| 黄毛片在线观看| 欧美日韩国产美| 激情综合丁香五月| 亚洲九九视频| 国产精品免费一区豆花| 秋霞av鲁丝片一区二区| 最近日韩中文字幕| 日本精品一区二区三区四区| 日韩精品视频在线看| 国产亚洲美女精品久久久| 国产精品9191| 国产在线观看免费一区| 日本一区二区三区免费观看| 国产高清在线a视频大全| 欧美日韩国产另类不卡| 亚洲自拍偷拍一区二区| 欧美日本国产| 91久久在线播放| 浮生影视网在线观看免费| 亚洲mv在线观看| 久久黄色一级视频| 亚洲欧美综合久久久| 国产91在线播放九色快色| 色呦呦视频在线| 尤物av一区二区| 五月天婷婷亚洲| 成久久久网站| 日本欧美一二三区| 久热av在线| 欧美日韩亚洲精品一区二区三区| www.四虎在线| 国产一区日韩一区| 999国产在线| 69成人在线| 日韩午夜av电影| 国产精品免费人成网站酒店| 久久精品久久精品| 亚洲乱码一区二区三区三上悠亚| 欧美91看片特黄aaaa| 欧美成人精品二区三区99精品| 中国一级片在线观看| 黄色资源网久久资源365| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 天天综合网天天| 亚洲人成在线播放| 五月激情丁香网| 欧美经典三级视频一区二区三区| 992kp快乐看片永久免费网址| 国产精品手机在线播放| 国产91精品最新在线播放| 久久视频www| 91国偷自产一区二区开放时间 | 欧美成人一区二区视频| 国产精品视频线看| 亚洲一区二区三区四区五区| 亚洲五月综合| www.成人三级视频| 欧美aa在线| 国产午夜一区二区| 一卡二卡三卡在线| 国产精品无码永久免费888| 国产一级不卡毛片| 欧美超碰在线| 亚洲jizzjizz日本少妇| heyzo在线播放| 精品亚洲一区二区| 中文字幕一区二区免费| 亚洲天堂成人在线观看| 中文字幕第3页| 首页欧美精品中文字幕| 一区二区在线中文字幕电影视频| 国产美女亚洲精品7777| 国产+人+亚洲| 丁香婷婷在线观看| 欧美一级欧美一级在线播放| 日韩乱码一区二区| 国产女同互慰高潮91漫画| 无码国产精品一区二区高潮| 伊人久久大香线蕉综合热线| 欧美另类高清视频在线| 日韩成人综合网| 久久免费国产视频| av二区在线| 精品99久久久久久| 综合久久中文字幕| 一区二区国产视频| 国产免费一区二区三区网站免费| 精品一区二区三区久久久| 中文字幕无码精品亚洲资源网久久| 少妇精品导航| 国产日韩欧美中文在线播放| www.51av欧美视频| 久久精品国产综合| 欧美69xxxxx| 欧美一级在线视频| 成人一级免费视频| 亚洲一区二区三区影院| 神马久久久久久久久久久| 国产91在线|亚洲| 麻豆三级在线观看| 国产视频亚洲| 99中文字幕在线观看| 精品国产一区二区三区小蝌蚪 | 国产又粗又猛又黄视频| 亚洲综合视频在线| 粉嫩精品久久99综合一区| av在线免费不卡| 色综合五月婷婷| 奇米色777欧美一区二区| 国产老熟妇精品观看| 香蕉国产精品| 欧美日韩一区二区视频在线 | 国产精品自拍首页| 国产麻豆一区二区三区| 国产精品一区久久久| 在线观看欧美日韩电影| 欧美裸体xxxx极品少妇| 欧美精品日韩少妇| 在线观看日韩av| 福利在线视频导航| 亚洲人午夜色婷婷| 天堂在线观看视频| 亚洲高清在线观看| 国产精品久久影视| 欧美日韩一级大片网址| 中日韩黄色大片| 精品福利在线看| 国产亚洲色婷婷久久99精品| 亚洲日本一区二区三区| 911国产在线| 亚洲欧洲www| 日韩亚洲欧美中文字幕| 国产精品私人影院| 亚洲一级片在线播放| 国产视频在线观看一区二区三区| 亚洲一区二区三区无码久久| 成人动漫中文字幕| 成人在线电影网站| av网站免费线看精品| 国产麻豆xxxvideo实拍| 99久久精品国产麻豆演员表| 波多野结衣影院| 91亚洲午夜精品久久久久久| 久久久久久久人妻无码中文字幕爆| 国产成人精品影院| 亚洲色图欧美另类| av电影在线观看完整版一区二区| 波多野结衣办公室双飞| www.久久久久久久久| www.日本高清| 久久久久久久久岛国免费| 欧美成人另类视频| 国产日韩精品久久久| 日本不卡一区视频| 国产精品看片你懂得| 一本一本久久a久久| 亚洲视频你懂的| 国产小视频在线看| 欧美日韩色婷婷| 国产偷人爽久久久久久老妇app| 欧美日韩亚洲不卡| 精品国产无码AV| 亚洲国产精品va在线看黑人| 青青草免费观看免费视频在线| 一本色道久久88亚洲综合88| 欧美日本高清| 久久久久久这里只有精品| av综合电影网站| 国产日韩欧美视频在线| 国产视频一区二区在线播放| 亚洲精品日韩激情在线电影| 日韩mv欧美mv国产网站| 亚洲精品永久www嫩草| 欧美日韩免费| 99久久久无码国产精品6| 精品一区二区综合| 美女扒开腿免费视频| 久久奇米777| 国产一二三区精品| 欧美性xxxx极品hd满灌| 91禁在线观看| 日韩精品视频在线免费观看| 77777影视视频在线观看| 欧美激情久久久久久| 亚洲伦理影院| 亚洲aa中文字幕| 亚洲亚洲免费| 日本xxxxx18| 日韩av中文在线观看| 手机看片国产精品| 久久精品亚洲乱码伦伦中文| 蜜臀久久精品久久久用户群体| 日韩欧美国产网站| 性一交一乱一精一晶| 在线播放亚洲激情| √天堂8资源中文在线| 91精品视频在线| 牛牛精品成人免费视频| 亚洲v欧美v另类v综合v日韩v| 亚洲午夜极品| 欧美丝袜在线观看| 久久久久久久免费视频了| 久久久综合久久| 欧美高清视频不卡网| 国际av在线| 亚洲91精品在线观看| 精品视频一区二区三区| 欧美性xxxx69| 99热精品在线| 在线视频 日韩| 亚洲午夜精品网| 精品国产亚洲av麻豆| 理论片在线不卡免费观看| 性感女国产在线| 久久96国产精品久久99软件| 欧美一区综合| 中文字幕一区久久| 欧美韩国日本一区| 亚洲熟妇无码乱子av电影| 亚洲精品一区二区在线观看| 在线你懂的视频| 91精品视频观看| 天天射—综合中文网| 黄色永久免费网站| 91看片淫黄大片一级在线观看| 麻豆亚洲av熟女国产一区二| 欧美丝袜第三区| 国产一区二区影视| 国产精品久久久久9999| 国产成人黄色| 少妇黄色一级片| 国产婷婷色一区二区三区在线| 无码人妻精品一区二区| 亚洲欧洲在线视频| 婷婷综合六月| 色综合影院在线观看| 奇米色一区二区三区四区| 夜夜春很很躁夜夜躁| 欧美亚洲丝袜传媒另类| 国产福利免费在线观看| 国产精品美女网站| 久久美女视频| 久国产精品视频| 一区二区成人在线观看| 免费看国产片在线观看| 午夜精品理论片| 亚洲自拍电影| 午夜精品在线免费观看| 中文字幕一区二区三区四区| 国产一区二区在线视频观看| 久久精品中文字幕一区| 久久丁香四色| 国产 日韩 亚洲 欧美| 久久久久久综合| 亚洲中文字幕在线观看| 美乳少妇欧美精品| 欧美天堂影院| 久久99999| 一区二区三区欧美久久| 外国精品视频在线观看 | 成人激情久久| 青春草国产视频| 久久久99精品免费观看| 国产精品视频无码| 91国产一区在线| 日韩精品免费| 欧美xxxxx少妇| 欧美性欧美巨大黑白大战| 亚洲综合影视| 日韩黄色影视| 国产成人精品在线看| 中文无码av一区二区三区| 欧美日韩国产成人在线| 国产伦精品一区二区三区千人斩 | 里番精品3d一二三区| 亚洲一区二区三区四区五区| 欧美日韩激情视频8区| 欧美三级电影一区二区三区| 精品一卡二卡三卡四卡日本乱码| 久久99久久99|