.NETFramework泛型
. NET Framework 泛型係在 . NET Framework 二章零个公共語言運行庫(CLR)中个增加一項新个功能,像係 C + + 个模板,毋過毋當 C + + 个模板靈活,毋過也有一息自家个特性。
變做 . NET Framework 引入了類型參數个概念,恁樣就做得設計出恁樣个類摎方法:佢兜摎指定類型个工作𢱤慢到客戶端代碼聲明還過實例化類或者方法个時節執行。比論講,通過泛型類型參數 T,程式設計師就做得編寫其他客戶端代碼做得使用个單個類,毋使愁會強制轉換抑係裝箱操作帶來另外个運行成本也係風險。
泛型編程
泛型類摎方法較之非泛型類摎方法有還較高个可用性、類型安全摎效率,而且通常用在集合摎集合上運行个方法當中。在 . NET Framework 二姣零个類庫當中添加了一個新个命名空間 System .Collections . Generic,其中含有一兜新个基於泛型个集合類。微軟建議程式設計師在設計面向 . NET Framework 二勤零个應用程式个時節毋好用舊个非泛型集合類(像ArrayList 集合類), 而去使用新个泛型集合類。
當然啊,程式設計師也做得創建自家个泛型類摎方法,提供自家需要个解決方案,毋過微軟無推薦自家創建泛型類,建議使用 . NET Framework 類庫當中提供个 List < T > 類。
做得通過泛型類型參數傳達一隻類型(像一個類 TestClass < T >)中个 T 係泛型个類型參數,做得通過佢傳遞一個類型(像係int), 該恁仔,在這個類當中所有用類型參數(在這例肚係 T)定義个欄位抑係方法這兜類型都會根據傳遞進來个類型(這例當中係 int 類型)所改變。
泛型類型參數
在定義泛型類或者方法當中,類型參數係客戶端程序實例化泛型類變量時指定个類型占位符。泛型類做毋得像一般个類恁仔使用,因為佢實際上毋係一個類型,可能過像一個類型个藍圖。愛使用泛型類啊,客戶端代碼必須指定尖括號碼中个類型參數並實例化類型才能構造類型。指定个類型參數做得係編譯器做得識別个任何類型,還過做得構造任意數目的使用無共樣類型參數个實例。
還安名規則
一般,微軟推薦採用著如下命名規則:
- 除非單隻字母做得分其他編寫者了解佢个意思,描寫性名稱並做毋得帶來著過較多其他个意義,應該使用描寫性短語作為類型參數个名稱
- 推薦使用 T 做一隻字母類型參數个參數名
- 應該將 T 作為有描述性个類型參數名前上色
- 推薦在類型參數名當中指出對這個類型參數个約束(比將有帶 ISession 約束个參數名寫為 TSession)。===泛型參數个約束===
對於泛型參數个約束係指對客戶端代碼實例化類時指定个類型參數進行限制,恁樣係講客戶端个程序參試使用某一隻做毋得分類型實例化類時會產生編譯个時節毋著。以 C # 為例仔,約束採用 where 上下文關鍵字指定。
做麼个用約束
若講愛對泛型列表裡肚个項摎其他某一隻項進行比較,就需要在一定程度項保證所調用个運算符或者方法做得以得著指定个類型參數个支持。這個保證當當係建立在對泛型類定義个一個抑係幾下隻約束得著个。一旦編譯器得著咧恁樣个保證,佢就做得允准在泛型類中調用一兜無約束个泛型當中做毋得使用个方法。
吂有定等个類型參數
無進行約束个泛型類型參數喊做係無䌈定个類型參數。
當使用無䌈定个類型參數个時節,相對使用了約束个類型參數,有以下規則:
- 做毋得分你用!=摎==運算符,因為編譯器無法度保證得著實例化个時節提供个類型參數个支持;毋過做得摎 null 進行比較。係講類型參數係值型,定著愛轉去 false。
- 做得摎 System . Object 將互相轉換,乜做得摎佢兜顯明个方式轉換做任何藉口類型
裸類型大約束
泛型類
泛型類做得有至少一個泛型類型參數,泛型類型參數做得代替泛型類个欄位、屬於性、方法个參數同轉去值、事件个參數同轉值、構造函數个參數个類型,也做得作為內部類摎基類還過實現接口个泛型類型參數。
泛型類一定愛在創建其實例時明確指定个類型參數个類型。泛型類个構造函數做毋得自動推斷佢泛型類型个泛型類型參數。
係講對形類派生,做得選擇確定个泛型類型參數,乜做得用泛型派生類,利用泛型派生類个泛型類型參數確定基類个泛型類型參數。
泛型接口
泛型接口个使用大體上摎泛型類共樣,淨係接口做毋得包含欄位摎構造函數,也不准創建實例。實現接口个時節,共樣也做得選擇實現確定个泛型類型接口,或者利用泛型類型參數確定接口个泛型類型參數。
泛型方法
泛型方法做得有至少一個泛型類型參數,泛型類型參數做得作為方法个參數抑係轉回值个類型。泛型方法毋使明確指定各種類型參數,做得由上下文自停動,假使講上下文無法度自動推斷,斯愛明確指定。
泛型委託
泛型委託个使用大體上摎泛型方法共樣,泛型委託个泛型類型參數可以在創建个時節通過上下文自動个推斷。來委託實例總係有確定个泛型類型參數。
反射
泛型摎 C + + 中模枋个區別
變做摎模板都係用提供類型參數支持个語言功能,毋過這兩個人有當多差別。
對語法層面來講,一般認為泛型係一種相對模板簡單个方法,並無具有模板个複雜性。毋過同時,泛型乜做毋得提供模板个完整功能。
另外一方面,從實現層面,泛型个替換係在運行該下執行个,恁樣做得為實例化个對象保留有還較多型類型个信息。
下背列出了 . NET Framework 泛型摎 C + + 模枋之間个主要區別:
- 泛型無提供摎模板相同程度个靈活性(像係泛型做毋得調用算數運算符)
- 泛型做毋得非類型模板參數(像係 template C < int i > { })
- 泛型毋支持顯式个特定類型模板个自定義實現
- 泛型毋支持類型參數子集个自定義實現
- 泛型當中做毋得摎類型參數作泛型類型个基類
- 泛型做毋得分類型參數係有默認个類型,必須愛在實例化个時節指定个泛型類型參數自家做毋得係泛型,毋過 C + + 確實允准模板參數。
C + + 允許程式設計師編寫可能對模板裡肚有兜類型參數無效个代碼,續下來會檢查該代碼當中有用作類型參數个特定類型無。比如講做得在 C + + 中編寫對類型參數對象个算術運算符个函數,恁樣在用毋支持這兜運算符个類型實例化模板个時節出現錯誤; 來泛型係做毋得恁仔个,佢就要求相應个編寫類當中个代碼,使佢兜能夠滿足任何个約束个類型。故所唯一允准个語言構造係該兜做得對約束當中推導出來个結構。
參看
- C #
- C ++
- 類庫
- . NET Framework
- 類型參數
- 接口
- 委託
System . Collections . Generic 安名空間
類========接口
結構
外部連結
- C # 語言規範(英文)
- . NET Framework 二側零(中文)