泛型
1.概述
2.创建泛型类
3.泛型类的特点
4.泛型接口
5.泛型结构
6.泛型方法
一、概述
泛型是CLR定义的,所以支持.net的语言就支持泛型。
优缺点:
1.性能
2.类型安全
3.二制代码重用
4.代码的扩展
5.命名约定
(一)、性能
名词:装箱,拆箱。(性能损失)
System.Collections.Generic名称空间中的List<T>类,对比ArrayList
(二)类型安全
(三)二进制代码的重用
(四)代码的扩展
(五)命名约定
命名规则:
● 泛型类型的 名称用字母 T作 为前缀。
● 如果没有特殊的要求,泛 型类型允许用任意类替代,且只使 用 了 一个泛型类型,就可以 用字符 T作 为泛型类型的 名称。
● 如果泛型类型有特定的 要求(例 如,它必须实现一个接 口 或派生基类),或者使用了 两个或多个泛型类型,就应给泛型类型使用描述性的名称
二、创建泛型类:即类似List<T>的类。需要创建的是“List”
泛型类 的定义与一般类类似 ,只 是要使用泛型类型声明。
之后 ,泛型类型就可 以在类 中用作一个字段成员,或者方法 的参数类型 。
三、泛型类的功能:
在创建泛型类时,还需要一些其他C#关键字,例如,不能把null赋予泛型类型。此时,可以使用default关键字。如果泛型类型不需要object类的功能 ,便需要调用泛型类上的某些特定方法,就可以定义约束。
包括:默认值,约束,继承,静态成员。
1.默认值:default
2.约束:where:
只能为默认构造函数定义构造函数约束,不能为其他构造函数定义构造函数约束。
使用泛型类型还可以合并多个约束
3.继承:
泛型类型可以实现泛型接口,也可以派生自一个类。泛型类可以派生自泛型基类,要求是必须重复接口的泛型类型,或者必须指定基类的类型。于是,派生类可以 是泛型类或非泛型类。 例如,可 以 定义一个抽象的 泛型基类,它在派生类中用一个具体的 类型实现。 这允许对特定类型执行特殊的 操作。
4.静态成员:泛型类的静态成员需要特别关注。泛型类的静态成员只能在类的一个实例中共享。
四、泛型接口
使用泛型可以定义接口,在接口中定义的方法可以带泛型参数。.net为不同的情况提供了许多接口。同一个接口常常存在比较老的非泛型版本。
1.协变和抗变
在.net之 前,泛 型接口 是不变的。 .NET4通过协变和抗变为泛型接口和泛型委托添加了一个 重要的扩展。 协变和抗变指对参数和返回 值的 类型进行转换。
2.泛型接口的协变:如果泛型类型用out关键字标,泛型接口就是协变的。这也意味着返回类型只能是T。
3.泛型接口的抗变:如果泛型类型用in关键字标注,泛型接口就是抗变的。这样,接口只能把泛型类型 T用作其方法的 输入.
五、泛型结构:
与类相似,结构也可以是泛型的,类似于泛型类,只是没有继承特性。
可空类型
泛型结构示例:Nullable<T>,int? a=null;(正常情况下值类型是不允许为null的)
非可空类型可以 转换为可空类型。 从非可空类型转换为可空 类型时,在 不需要强制类型转换的地方可以 进行隐式转换。但从可空类型转换为非可空 类型可能会失败。 如果可空类型的 值是 null,并 且把null值赋予非可空类型,就会抛出InvalidOperationException类型的异常。如果不进行显式类型转换,还 可以 使 用合并 运算符(coalescing operator)从 可空类型转换为非可空类型。 合并运算符的 语法是"??", 为转换定义了 一个默认值,以 防可空类型的值是 null;
六、泛型方法:
除了定义泛型类之外,还可以定义泛型方法,在泛型方法中,泛型类型用方法声明来定义 。泛型方法可以在非泛型类中定义。
带约束的泛型方法
带委托的泛型方法
泛型方法规范
————未深入理解,待续