标签:实例 前缀 派生 操作 参数 对象类型 值类型 string 1.2
泛型可以创建独立于被包含类型的类和方法
性能、类型的安全性、二进制代码重用、代码的拓展、命名约定
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 泛型类的功能
标签:实例 前缀 派生 操作 参数 对象类型 值类型 string 1.2
原文地址:https://www.cnblogs.com/code1992/p/10057602.html