【系列文章目录】
前言
本篇介绍泛型
一、什么是泛型
泛型将类型参数的概念引入 .NET,这样就可设计具有以下特征的类和方法:在客户端代码声明并初始化这些类或方法之前,这些类或方法会延迟指定一个或多个类型。
泛型类和泛型方法兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法无法实现的。
在C#1.0中的冗长代码因为泛型而大大的改善
泛型可以在设计一个类或方法时,将类型作为参数来传入
提高了代码的复用性、安全性并且还提高了性能
这些也是泛型的特点
- 代码复用性
泛型类定义一次,可以用类型参数来做不同的实例化操作
例如List在实例化的时候指定类型,就可以实例化为只包含T类型的List - 安全性
如果在ArrayList类中添加一个整数、一个字符串、一个类实例化出来的对象
这个时候使用Foreach语句迭代并转换为Int就会出现异常
而泛型很好的解决了这个问题
例如在List中,使用List的定义,能被放入List中的就只能是int类型 - 提高性能
泛型并不是在使用对象,而是使用定义类型
例如当List的泛型类型定义为int
int类型在JIT编译器动态生成的类中使用
不需要再进行装箱和拆箱操作
(从值类型转换为引用类型称为装箱,从引用类型转换为值类型称为拆箱)
二、泛型约束
在使用泛型的时候我们还可以为泛型添加约束来进行设计
泛型约束就是使用where来添加约束条件的的
public class Singleton<T> where T : Singleton<T>{
//...
}
这是一个单例基类的泛型约束写法
在我们使用继承来定义一个单例类的时候
可以保证Singleton中传入的T是继承了Singleton的
三、泛型使用
在实际使用中,如果不是设计底层逻辑或者要做框架和库
只是写一些逻辑层和UI层的话
基本上掌握List 和 Dictionary 这些API的使用也就够了
但是如果要做框架和库或者做一些通用的底层逻辑
掌握泛型来做API就必不可少了
通常我们需要设计的泛型API有:
- 泛型接口
public interface Base<T> where T : Base<T> { T Value { get; set; } }
- 泛型类
public class Singleton<T> where T : Singleton<T> { //... }
- 泛型方法
public void Fun<T>(T args) where T: struct { Debug.Log(args); }
- 泛型委托
public delegate void dele<T>(T args);
而他们可以与泛型反射配合使用
- 泛型的反射
var type = typeof(T);