泛型介紹 入門的好材料

2021-04-17 02:08:50 字數 2901 閱讀 4439

最近開始學習泛型,看了一些網上的文章和書中的介紹,把其中的一些內容摘抄如下:

泛型是什麼

一種型別佔位符,或稱之為型別引數。我們知道在乙個方法中,乙個變數的值可以作為引數,但其實這個變數的型別本身也可以作為引數。泛型允許我們在調用的時候再指定這個型別引數是什麼。在.net中,泛型能夠給我們帶來的兩個明顯好處是——型別安全和減少裝箱、拆箱。

型別安全和裝箱、拆箱

作為一種型別引數,泛型很容易給我們帶來型別安全。而在以前,在.net1.1中我們要實現型別安全可以這樣做:

//假設你有乙個人員集合

public

class

person

set } }

//假設你有乙個人員集合

public

class

personcollection : ilist }

public

int add(person item)

public

void remove(person item)

object

ilist.this[int index]

set }

intilist.add(object item)

void

ilist.remove(object item)

... }

上述**主要採用了顯性介面成員(explicit inte***ce member implementation)技術,能夠實現型別安全,但問題是: l

產生重複**。假設你還有乙個dog類集合,其功能相同,但為了型別安全,你必須要copy乙份**,這樣便使程式重複**增加,當面對變化的時候,更難維護。

public

class

dogcollection : ilist }

public

int add(dog item)

public

void remove(dog item)

object

ilist.this[int index]

set }

intilist.add(object item)

void

ilist.remove(object item)

... }

如果在泛型中,要實現型別安全,你不需要拷貝任何**,你僅僅需要這樣做:

list

persons = new

list

();persons.add(new

person());

person person = persons[0];

list

dogs = new

list

();dogs.add(new

dog());

dogdog = dogs[0]; l

對於值型別的物件還是需要額外的裝箱、拆箱。其實對於傳統的集合來說,只要其中的包含的內容涉及到值型別,就不可避免需要裝箱、拆箱。請看下面的例子。

public

class

intcollection : ilist }

public

int add(int item)

public

void remove(int item)

object ilist.this[int index]

set }

int ilist.add(object item)

void ilist.remove(object item)

... }

static

void main(string args)

少量裝箱、拆箱對效能的影響不大,但是如果集合的資料量非常大,對效能還是有一定影響的。泛型能夠避免對值型別的裝箱、拆箱操作,您可以通過分析編譯後的il得到印證。

static

void main()

泛型的實現

l泛型方法

static

void swap(ref t a, ref t b) ",

typeof(t));

t temp;

temp = a;

a = b;

b = temp; }

l泛型類、結構

public

class

point

set }

public t y

set }

public

override

string tostring()

, ]", _x, _y); } }

泛型的where

泛型的where能夠對型別引數作出限定。有以下幾種方式。 l

where t : struct   限制型別引數t必須繼承自system.valuetype。 l

where t : class    限制型別引數t必須是引用型別,也就是不能繼承自system.valuetype。 l

where t : new()   限制型別引數t必須有乙個預設的建構函式 l

where t : nameofclass 限制型別引數t必須繼承自某個類或實現某個介面。

以上這些限定可以組合使用,比如:

public

class

point

where t : class, icomparable, new()

泛型的機制

l機制:

c#泛型**在被編譯為il**和無資料時,採用特殊的佔位符來表示泛型型別,並用專有的il指令支援泛型操作。而真正的泛型例項化工作以"on-demand"

泛型介紹 入門的好材料

最近開始學習泛型,看了一些網上的文章和書中的介紹,把其中的一些內容摘抄如下 泛型是什麼 一種型別佔位符,或稱之為型別引數。我們知道在乙個方法中,乙個變數的值可以作為引數,但其實這個變數的型別本身也可以作為引數。泛型允許我們在調用的時候再指定這個型別引數是什麼。在.net中,泛型能夠給我們帶來的兩個明...

泛型 泛型入門 萬用字元 泛型的其它應用

泛型可以解決資料型別的安全性問題,它主要的原理是 是在類宣告的時候通過乙個標識表示類中某個屬性的型別或者是某個方法的返回值及引數型別。這樣在宣告類或例項化的時候只要指定好需要的型別即可。泛型的定義格式 訪問許可權 class 類名稱 泛型型別1,泛型型別2,泛型型別3 訪問許可權 返回值型別宣告 方...

泛型簡單介紹

泛型的優勢 1 效能 泛型的使用可以避免由於值型別和引用型別轉換時候所發生的裝箱和拆箱問題 常用arrarylist使用方法,在object和int型別裝換過程中存在裝箱和拆箱過程 arrarylist array new arraylist list.add 12 裝箱 int h int lis...