泛型简介
泛型的作用
- 跨类型可复用的代码:继承 和 泛型。
- 继承 –> 基类
- 泛型 –> 带有“(类型)占位符” 的“模板”
泛型类型(Generic Types)
- 泛型会声明类型参数 – 泛型的消费者需要提供类型参数(argument)来把占位符类型填充上。
Open Type & Closed Type
- Stack
Open Type(开放类型) - Stack
Closed Type(封闭类型) - 在运行时,所有的泛型类型实例都是封闭的(占位符类型已被填充了)
为什么泛型会出现?
- 需要装箱和向下转换,这种转换在编译时无法进行检查
泛型方法
- 泛型方法在方法的签名内也可以声明类型参数
- 在泛型类型里面的方法,除非也引入了类型参数(type parameters),否则是不会归为泛型方法的。
- 只有类型和方法可以引入类型参数,属性、索引器、事件、字段、构造函数、操作符等都不可以声明类型参数。但是他们可以使用他们所在的泛型类型的类型参数。
声明类型参数
- 在声明class、struct、interface、delegate的时候可以引入类型参数(Type parameters)。
- 其它的例如属性,就不可以引入类型参数,但是可以使用类型参数。
public struct Nullable
{
public T Value {get;}
}
声明类型参数
- 泛型类型/泛型方法可以有多个类型参数:
声明泛型类型
- 泛型类型/泛型方法的名称可以被重载,条件是参数类型的个数不同:
class A {}
class A {}
class A {}
- 按约定,泛型类型/泛型方法如果只有一个类型参数,那么就叫T。
- 当使用多个类型参数的时候,每个类型参数都使用T作为前缀,随后跟着具有描述性的一个名字。
Typeof 与 未绑定的泛型类型
- 开放的泛型类型在编译后就变成了封闭的泛型类型。
- 但是如果作为Type对象,那么未绑定的泛型类型在运行时是可以存在的。(只能通过typeof操作符来实现)
泛型的默认值
- 使用default关键字来获取泛型类型参数的默认值