1. 程式人生 > >第6章 泛型

第6章 泛型

例如 泛型 1.4 必須 但是 實現 所有 arr 遍歷

泛型可以創建獨立於被包含類型的類和方法

性能、類型的安全性、二進制代碼重用、代碼的拓展、命名約定

6.1.1 性能

var list = new ArrayList();
list.Add(4);  //裝箱
int il = (int) list [0]; //拆箱

var list = new List<int>();
list.Add(44); //不用裝箱
int il = list[0]; //不用拆箱

ArrayList類存儲對象,把對象作為參數,需要大量裝箱和拆箱。

List<T>類不使用對象,而是在使用時定義類型,定義的類型在JIT編譯器動態生成的類中使用,不再進行裝箱和拆箱操作

6.1.2 類型安全

ArrayList可以Add任意類型,foreach遍歷int類型時遇到不是int就會異常。

List<T>泛型類型T定義了允許使用的類型

6.1.3 二進制代碼的重用

泛型類型可以定義一次,可以用許多不用的類型實例化

var list = new List<int>();
var stringList = new List<string>();
var myClassList = new List<MyClass>();

6.1.4 代碼的拓展

在不同的特定類型實例化泛型時,會創建多少代碼?因為泛型類的定義會放在程序集中,所以用特定類型實例化泛型類不會在IL代碼中賦值這些類。但是,在JIT編譯器把泛型類編譯為本地代碼時,會給每個值類型創建一個新類。引用類型共享同一個本地類的所有相同的實現代碼。這是因為引用類型在實例化的泛型類中只需要4個字節的內存地址(32位系統),就可以引用一個引用類型。值類型包含在實例化的泛型類的內存中,同時因為每個值類型對內存的要求都不通,所以要為每個值類型實例化一個新類。

(看不懂)

6.1.5 命名約定

泛型類型的名稱用字母T作為前綴 public class List<T> ()

如果沒有特殊的要求,泛型類型允許用任意類替代,且只使用了一個泛型類型,就可以用字符T作為泛型類型的名稱 public class LinkedList<T>

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

public class SortedList<TKey, TValue>()

6.2 創建泛型類

每個處理對象類型的類都可以有泛型實現方式,這樣有利於消除類型強制轉換操作

6.3 泛型類的功能

第6章 泛型