第6章 泛型
泛型可以創建獨立於被包含類型的類和方法
性能、類型的安全性、二進制代碼重用、代碼的拓展、命名約定
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章 泛型