泛型將型別引數的概念引入了.net,當我們需要設計類和方法,並將它們的型別制定推遲到客戶端**宣告,並例項化該型別和方法時,可以使用泛型。泛型使之前的想法成為了可能。使用泛型避免了執行時強制轉換或裝箱操作帶來的風險。簡單來說,首先制定乙個特定符號代替實際型別,當建立該型別的例項時,才指定它的實際型別。
泛型可以讓類、結構、委託、介面和方法通過他們所儲存和操作的資料的型別被引數化。
為什麼要使用泛型?我們以例項來說明:
在上面的**中,使用的全部都是整型變數,在軟體設計中,去求是經常變更的,如果我要求輸入的是浮點型該怎麼辦呢?當然,我們可以把int改為object,並使用強制轉換,如下面所示:
我們看到,上面的程式也能夠編譯通過並執行,但實際上這是非常消耗資源的,因此這種方法並不可用。而泛型就是為了解決這個問題而存在的,使用泛型很簡單,看下面的**:
在泛型例項化後,可以很方便的制定他的修飾符為double或string。
泛型的約束:
為了對客戶端**在例項化時對型別引數加以限制,可以使用泛型的約束,約束是使用where 關鍵字指定的,共有6種約束型別
約束說明
t:結構
型別引數必須是值型別 。可以指定除 nullable 以外的任何值型別。有關更多資訊,請參見使用可以為 null 的型別(c# 程式設計指南) 。
t:類型別引數必須是引用 型別;這一點也適用於任何類、介面、委託或陣列型別。
t:new()
型別引數必須具有無引數的公共建構函式。當與其他約束一起使用時,new() 約束必須最後指定。
t:《基類名》
型別引數必須是指定的基類或派生自指定的基類。
t:《介面名稱》
型別引數必須是指定的介面或實現指定的介面。可以指定多個介面約束。約束介面也可以是泛型的。
t:u為 t 提供的型別引數必須是為 u 提供的引數或派生自為 u 提供的引數。這稱為裸型別約束。
C 泛型學習筆記
泛型概述 使用泛型型別可以最大限度地重用 保護型別的安全以及提高效能。泛型最常見的用途是建立集合類。net framework 類庫在 system.collections.generic 命名空間中包含幾個新的泛型集合類。應盡可能地使用這些類來 代替普通的類,如 system.collection...
C 學習筆記 泛型演算法
標準庫給容器定義了一些基本的操作,還定義了一組泛型演算法,稱它們為演算法,是因為它們實現了一些經典演算法的公共介面,如排序和搜尋,稱它們是泛型的,是因為它們可以用於不同型別的元素和多種容器型別,甚至包括內建陣列型別。泛型演算法通過迭代器來進行相應的操作,根據操作的不同,可以將泛型演算法分為唯讀演算法...
C 學習筆記(五) 泛型
泛型使型別引數化,從而實現了演算法上的 重用。同時由於去掉了轉換中裝箱和拆箱的操作,使用泛型還可以提高程式的執行速度。我們先看看c 自帶的使用了泛型的類 1 using system.collections.generic 23 namespace study417 18 通過使用泛型,我們可以重複...