泛型

.net自從2.0版本就開始支持泛型,泛型不只是c#語言的一部分,並且與程序集中的IL代碼緊密地集成。有了泛型,就能夠建立獨立於被包含類型的類和方法了,咱們沒必要給不一樣的類型編寫功能相同的許多方法或類,只建立一個方法或類便可。另外一個減小代碼的選項是使用object類,但object類不是類型安全的。泛型類使用泛型參數,並能夠根據須要用特定的類型替換泛型類型。這就保證了類型安全性:若是某個類型不支持泛型類,編譯器就會出現錯誤。c++

泛型就是延遲賦予類型定義

a.性能:
泛型的一個主要優勢就是性能。值類型存儲在棧上,引用類型存儲在堆上。對值類型使用非泛型集合類,在把值類型轉換爲引用類型,和把引用類型轉換爲值類型時,須要進行裝箱和拆箱操做。這樣的操做性能損失比較大,遍歷許多項時尤爲如此。使用泛型就能夠避免這樣裝箱和拆箱的動做。
b.類型安全:
使用泛型能夠確保類型安全
c.二進制代碼重用:
泛型容許更好地重用二進制代碼。泛型類能夠定義一次,而且能夠用許多不一樣的類型實例化。不須要像c++模板那樣訪問源代碼。
d.代碼擴展:
在用不一樣的特定類型實例化泛型時,會建立多少代碼?由於泛型類型的定義會放在程序集中,因此用特定類型實例化泛型類不會再IL代碼中複製這些類。可是,在JIT編譯器把泛型類編譯爲本地代碼時,會給每一個值類型建立一個新類。引用類型共享同一個本地類的全部相同的實現代碼。這是由於引用類型在實例化的泛型類中只須要4個字節(32位系統),就能夠引用一個引用類型。值類型包含在實例化的泛型類的內存中,同時由於每一個值類型對內存的要求不一樣,因此要爲每一個值類型實例化一個新類。
e.命名約定:
若是在程序中使用泛型,在區分泛型類型和非泛型類型時就會有必定的幫助。一、泛型類型的名稱用字母T做爲前綴。二、若是沒有特殊要求,泛型類容許用任意類替代,且只使用了一個泛型類型,就能夠用字母T做爲泛型類型的名稱。c#

public class List<T>

三、若是泛型類型有特定的要求(例如,它必須實現一個接口或派生自基類),或者使用了兩個或多個泛型類型,就應給泛型類型使用描述性的名稱:安全

public  class SortedList<TKey,TValue>

泛型支持幾種約束類型:
where T:struct 對於結構約束,類型T必須是值類型
where T:class 對於類約束,類型T必須是引用類型
where T:IFoo 指定類型T必須實現接口IFoo
where T:Foo 指定類型T必須派生自基類Foo
where T:new() 這是一個構造函數約束,指定類型T必須有一個默認構造函數
where T1:T2 這個約束也能夠指定,類型T1派生自泛型類型T2.該類型約束也稱爲裸類型約束
如:public calss MyClass where T:IFoo,new() 函數

相關文章
相關標籤/搜索