跳至內容

.NETFramework泛型

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

. 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 二孵空(中文)