1 5 1 泛型總覽

2021-09-26 09:29:24 字數 2239 閱讀 6912

泛型是.net 中重要的一部分。

那麼接下來將從一下幾個方面來介紹泛型

1、效能

2、型別安全

3、二進位制**的重用

4、**膨脹

5、命名手冊

首先回顧一下值型別和引用型別:

值型別是存在棧中的,引用型別是存在堆中的,c#類為引用型別,結構體為值型別。

對於.net來說,值型別轉化為引用型別是很容易的。 舉個例子,當int型別轉化為object型別時,就是從值型別轉化為引用型別,稱之為裝箱。該型別通過方法的引數傳遞後,當被使用時,就會拆箱,拆箱後將object型別轉化為int型別。

舉個實際的例子:

static void main(string args)

}

集合型別使用的命名空間為:using system.collections;

拆箱和裝箱是很容易實現,但是會影響我們的效能,尤其是對含有很多元素的集合遍歷的時候。

static void main(string args)

}

泛型類的命名空間為:using system.collections.generic;

由於泛型類不會發生拆裝箱,所以不會消耗cpu和記憶體資源,所以處理很快。

泛型的另乙個特性是型別安全性。

var list = new arraylist();

list.add(44);

list.add("mystring");

list.add(new myclass());

上面**定義了乙個集合,該集合任何型別都可以往裡面填充。

foreach (int i in list)

當遍歷該集合時,由於不是所有的型別都能轉換為int型別,所以在執行的過程中就會報錯。

然而泛型就解決了這個問題。

var list = new list();

list.add(44);

list.add("mystring"); // compile time error

list.add(new myclass()); // compile time error

上述泛型類,只能往泛型中新增int型別,如果其他型別的則不能通過編譯。

泛型支援更好的二進位制**重用。泛型類可以定義一次,並且可以用許多不同的型別例項化。

var list = new list();

list.add(44);

var stringlist = new list();

stringlist.add("mystring");

var myclasslist = new list();

myclasslist.add(new myclass());

至於說為何范型可以二進位制重用,是因為范型**其實都在操作object類,而不是int或者string,范型類的二進位制指令碼處理的都是object,不管反省引數是int還是string,因為int裝箱後的integer和string都是object的派生類,所以二進位制**可以用同樣方式處理它們,把它們當成object處理,這樣處理方法就一樣了,

至於new list()和 new list()其實new出來的東西都是一樣的,只是加上反省引數,編譯的時候可以檢查型別錯誤而已,list內部處理int和string都是一樣的,都當作object處理,

當用不同的特定型別例項化泛型時,您可能想知道使用泛型建立了多少**。由於將泛型類定義放入程式集中,用特定型別例項化泛型類不會在il**中複製這些類。但是,當jit編譯器將泛型類編譯為本機**時,將為每種特定的值型別建立乙個新類。引用型別共享同乙個本機類的所有相同實現。這是因為對於引用型別,只有乙個4位元組的記憶體位址(with)內部需要32位系統.

使用字母t作為泛型類的字首。

如果你不確定傳入什麼泛型類,那麼就用t字母代替

public class list

public class linkedlist

public class sortedlist

public delegate void eventhandler(object sender,

teventargs e);

public delegate toutput converter(tinput from)

泛型 泛型類 泛型方法 泛型擦除

1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...

泛型 (2)泛型類 泛型方法 泛型介面

一 泛型類 定義person類 package cn.itcast.p2.bean public class person implements comparable public person string name,int age public int compareto person p ov...

泛型 泛型介面

泛型介面 介面上要宣告泛型,介面的抽象方法要接這個泛型。實現類的宣告也要寫具體的泛型實參。注意 泛型實參要用引用資料型別。基本資料型別不行。如果一定要使用基本資料型別那麼得使用基本資料型別的包裝類。如果實現類中的型別不確定,也想帶泛型,並且和介面中的一致。那麼在實現類中宣告,將在此處宣告的 類的泛型...